【问题标题】:Could not find an implementation of the query pattern for source tpe "Task<List<Stocks>> StockList" select not found找不到源 tpe“Task<List<Stocks>> StockList”的查询模式的实现选择未找到
【发布时间】:2020-09-18 03:32:24
【问题描述】:

我试图通过添加 Async/Await 来改进我的桌面应用程序,这里是我的代码查询数据库

public async Task<List<Stocks>> StockListAsync()
    {
        List<Stocks> stocks = new List<Stocks>();
        {
            conn = await App_Code.DbConnection.InitializeConnectionAsync();               
            string cnt = "SELECT * FROM tblStock";
            cmd = new SqlCommand(cnt, conn);               
            rd = cmd.ExecuteReader();
            if (rd.HasRows == true)
            {
                while (await rd.ReadAsync())
                {
                    var rm = new Stocks
                    {
                        ID = Convert.ToInt32(rd["ID"]),
                        Supplier = Convert.ToInt32(rd["Supplier"]),
                        StockCode = rd["StockCode"].ToString(),
                        StockName = rd["StockName"].ToString(),
                        Description = rd["Description"].ToString(),
                        UnitMeasure = rd["Measurement"].ToString(),
                        Quantity = Convert.ToInt32(rd["Quantity"]),
                        OrderQty = Convert.ToInt32(rd["OrderQty"]),
                        Cost = Convert.ToDouble(rd["Cost"]),
                    };
                    stocks.Add(rm);
                }
            }
            return stocks;
        }



        //}
    }

上面的代码是一个名为 Stocks 的单独类,然后是我想要显示结果的 windows 窗体我创建了一个这样的股票类实例 * readonly Stocks stock = new Stocks();* 而且我还有一个方法GetStock 下面是代码

 void GetStocks()
    {
        var list = stock.StockListAsync();           
            var result = from g in list 
                         select g;
            GrdFood.Rows.Clear();
            foreach (var item in result)
            {
                GrdFood.Rows.Add(GrdFood.RowCount + 1, item.Supplier, item.StockName,
                    item.Description, item.Quantity.ToString("N2"), item.OrderQty.ToString("N2"),
                    Convert.ToDouble(item.Cost).ToString("N2"), item.ID);

            } 
    }

然后在FormLoad事件上我调用了GetStocks 问题是下面代码中的List报错了找不到查询的实现源类型 Task> StockList 选择未找到的模式

 var list = stock.StockListAsync();           
            var result = from g in list 
                         select g;

在我做异步任务之前一切正常,请问我该如何纠正这个实现谢谢。

【问题讨论】:

标签: c# winforms asynchronous


【解决方案1】:

将方法更改为异步并等待调用 stock.StockListAsync。 像这样的

async void GetStocks()
{
    var list = await stock.StockListAsync();           
        var result = from g in list 
                     select g;
        GrdFood.Rows.Clear();
        foreach (var item in result)
        {
            GrdFood.Rows.Add(GrdFood.RowCount + 1, item.Supplier, item.StockName,
                item.Description, item.Quantity.ToString("N2"), item.OrderQty.ToString("N2"),
                Convert.ToDouble(item.Cost).ToString("N2"), item.ID);

        } 
}

StockListAsync() 返回 Task&lt;List&lt;Stocks&gt;&gt; 而不是 List&lt;Stocks&gt; 以应用查询,因此出现错误。

【讨论】:

  • async void 不推荐。如果一定要用await,那你就得用async Task,你会发现到处都需要用到。
  • @Neil 是的,这不是一个好习惯。但提出的解决方案是解决该职位的具体问题。我还评论了这篇文章以查看异步编程基础知识,这让他对此有更多的了解。
【解决方案2】:

因为你没有正确使用 async/await,list 的类型是 Task&lt;List&lt;Stock&gt;&gt;,而不是 List&lt;Stock&gt;,因为这就是 async 的工作原理

Task<List<Stock>>list = stock.StockListAsync();   

你真正想要的是:

List<Stock>> list = await stock.StockListAsync().ConfigureAwait(false);

但是,要使用await,你的函数必须是async

async Task GetStocksAsync() <-- Async functions should have an Async suffix
{
    var list = await stock.StockListAsync().ConfigureAwait(false);
        var result = from g in list 
                     select g;
        GrdFood.Rows.Clear();
        foreach (var item in result)
        {
            GrdFood.Rows.Add(GrdFood.RowCount + 1, item.Supplier, item.StockName,
                item.Description, item.Quantity.ToString("N2"), item.OrderQty.ToString("N2"),
                Convert.ToDouble(item.Cost).ToString("N2"), item.ID);

        } 
}

那么您的问题是您需要将调用 GetStocksAsync 的代码更改为异步/等待等。此时您可能想知道是否真的值得努力重写已经可以异步运行的东西。

【讨论】:

  • 谢谢你们的回答很好,我实际上是在阅读一篇文章来学习异步然后我决定在我现有的应用程序上尝试它,只是为了清楚@Nell .ConfigureAwait( false); 是什么意思?我不确定那是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 2013-02-06
  • 2012-01-03
  • 2015-09-23
  • 2010-11-10
  • 2018-02-24
相关资源
最近更新 更多