找不到源tpe“ Task <List <Stocks >> StockList”选择的查询模式的实现

时间:2020-05-30 15:55:39

标签: c# winforms asynchronous

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

<v-text-field
  label="Regular"
  solo
  >
  <template v-slot:prepend>
    <v-icon class="mx-5">mdi-account</v-icon>
  </template>
</v-text-field>

上面的代码是一个单独的类,称为Stocks,然后在Windows窗体中显示我创建的stock类实例的结果,例如 * readonly Stocks stock = new Stocks(); * ,我也有一种方法 GetStock ,下面是代码

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;
        }



        //}
    }

然后在我称为 GetStocks 的FormLoad事件上,问题是以下代码中的 List 报告错误找不到查询的实现找不到源类型Task> StockList选择的模式

 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);

            } 
    }

在我将其设置为异步任务之前,一切工作正常,谢谢。我该如何更正此实现。

2 个答案:

答案 0 :(得分: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<List<Stocks>>而不是List<Stocks>来应用查询,因此出错。

答案 1 :(得分:1)

由于您未正确使用异步/等待,因此list的类型为Task<List<Stock>>,而不是List<Stock>,因为这就是异步的工作方式

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的代码也更改为异步/等待等。在这一点上,您可能想知道重写所有已经可以异步工作的东西是否真的值得。