无法将 system.threading.tasks.task 转换为 system.collections.generic.list [重复]

Posted

技术标签:

【中文标题】无法将 system.threading.tasks.task 转换为 system.collections.generic.list [重复]【英文标题】:cannot convert system.threading.tasks.task to system.collections.generic.list [duplicate] 【发布时间】:2021-03-09 20:10:26 【问题描述】:

是的,这(很可能)是重复的,但我制作这个重复的原因是因为我尝试了在 ***(和其他网站)上找到的其他答案,但没有一个对我有用。所以我假设我做错了什么,或者我的问题不是呈现给我的内容。

我的错误是:cannot convert system.threading.tasks.task to system.collections.generic.list

我已经读到问题可能是我的方法不是异步的并且我返回的内容应该等待,但不幸的是这也没有解决问题。我尝试了其他几个解决方案,例如创建一个从我的构造函数调用的异步方法等,但不幸的是......没有成功。

这就是我现在所拥有的(请注意:我再次取出了 async 和 await 关键字,因为它们没有帮助):

    public class AButDatabase
    
    static readonly Lazy<SQLiteAsyncConnection> lazyInitializer = new Lazy<SQLiteAsyncConnection>(() =>
    
        return new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);
    );

    static SQLiteAsyncConnection Database => lazyInitializer.Value;
    static bool initialized = false;

    public AButDatabase()
    
        InitializeAsync().SafeFireAndForget(false);
    

    async Task InitializeAsync()
    
        if (!initialized)
        
            if (!Database.TableMappings.Any(m => m.MappedType.Name == typeof(ABut).Name))
            
                await Database.CreateTablesAsync(CreateFlags.None, typeof(ABut)).ConfigureAwait(false);
            
            initialized = true;
        
    

    public Task<List<ABut>> GetItemsAsync()
    
        return Database.Table<ABut>().ToListAsync();
    

我使用数据库连接的第二堂课:

       //THE PROPERTIES ARE CORRECT
       public DashboardViewModel()
       

        if (Connection == null)
        
            Connection = new AButDatabase();
        
          //CHANGED THE PROPERTY NAME FOR EASIER READABILITY, IT IS SET HOWEVER
           propNameAButs = Connection.GetItemsAsync(); // causes the error
        
      

我已经尝试了很多,并阅读了有关问题本身、async 和 await 关键字以及它们如何工作等的信息,但不幸的是,到目前为止还没有成功。

唯一可以防止错误,但在我尝试运行应用程序时会中断:

propNameAButs = (List<ABut>)(IEnumerable<ABut>)Connection.GetItemsAsync();

我正在寻找的期望行为:

能够将其作为List 检索并使用它

【问题讨论】:

reason I am making this duplicate is because I have tried the other answers 请向我们展示您实施***.com/a/12520574/34092 的尝试。 【参考方案1】:

你需要使用async/await

AButs = await Connection.GetItemsAsync(); 

public async Task<List<ABut>> GetItemsAsync()

    return await Database.Table<ABut>().ToListAsync();

编辑:您在已删除的评论中提到

我不能,因为构造函数不是异步的。我得到的错误是: “await”运算符只能在异步方法中使用

答案是什么,

    不要从构造函数调用(使用 OnAppearing) 不要使用 SQLite 异步 API 阅读有关从构造函数调用异步方法的众多现有问题之一

【讨论】:

一个。不要从构造函数调用(使用 OnAppearing),或者 b.不要使用 SQLite 异步 API,或者 c.阅读有关从构造函数调用异步方法的许多现有问题之一 从我的答案中复制 OP 评论,将其和您的评论添加到答案中,并且很高兴地在权力赋予我的最大范围内投票 @Jason 为了更清晰,我编辑了 OP。 这并没有真正改变我的答案,尽管使用OnAppearing 仅适用于页面的上下文。您没有解释在尝试应用其他类似问题的答案时遇到的具体问题。另一个简单的解决方法是在您的 VM 中使用 async Init 方法,而不是从构造函数中调用您的代码。

以上是关于无法将 system.threading.tasks.task 转换为 system.collections.generic.list [重复]的主要内容,如果未能解决你的问题,请参考以下文章

基于任务的并发比直接使用 System.Threading.Thread 慢得多

实体框架,LINQ 查询

如何在 .Net v 4 项目中安装 Dataflow 库?

SQL Server Management Studio 无法将类型为“System.__ComObject

为啥我无法正确获取图像数据或无法将数据发送到服务器?

无法将 createdAt 和 updatedAt 保存为日期时间值,也无法将后端保存为前端