我试图通过添加异步/等待查询数据库来改进我的桌面应用程序--这是我的代码
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;
}
//}
}上面的代码是一个单独的类,名为stock,然后我在windows窗体上显示了我创建的股票类的实例,如这个* readonly =GetStock();*和我还有一个方法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 )上,问题是下面代码中的列表报告了错误,无法找到源类型Task> StockList select not查找查询模式的实现。
var list = stock.StockListAsync();
var result = from g in list
select g;在我完成异步任务之前,一切都进行得很好,请如何更正这个实现--谢谢。
发布于 2020-05-30 16:17:36
将方法更改为异步并等待调用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>来应用查询,因此出现了错误。
发布于 2020-05-30 16:29:55
因为您没有正确地使用异步/等待,所以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的代码,使其也是异步/等待等。此时,您可能想知道是否真的值得重新编写已经生效的异步代码。
https://stackoverflow.com/questions/62105007
复制相似问题