我试图通过添加异步/等待查询数据库来改进我的桌面应用程序,这是我的代码
<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);
}
}
在我将其设置为异步任务之前,一切工作正常,谢谢。我该如何更正此实现。
答案 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的代码也更改为异步/等待等。在这一点上,您可能想知道重写所有已经可以异步工作的东西是否真的值得。