这是我到目前为止所做的... FillDataTable()
工作得很好,但我遇到了问题,因为我有同步代码和大量调用背靠背。他们中的许多人已准备好在诉讼程序结束前运行。试图将其转换为async/await
。我从我见过的其他示例中复制了FillAsync()
,因此它可能是Franken代码。
public static DataTable FillDataTable(string sql, Database _db) {
using (OleDbConnection conn = NewConnectionFromGivenDB(_db)) {
conn.Open();
using (OleDbCommand comm = new OleDbCommand(sql, conn)) {
using (OleDbDataAdapter da = new OleDbDataAdapter(comm)) {
using (DataTable dt = new DataTable()) {
da.Fill(dt);
}
conn.Close();
return dt;
}
}
}
}
public static async Task<DataTable> FillAsync(string sql, Database _db) {
return await Task.Run(() => { return FillDataTable(sql, _db); });
}
当我在async
方法中调用以下内容时,代码永远不会返回。
DataTable dt = await FillAsync(sql, Database.Oracle);
任何人都可以看到有什么问题或给我一些更好的前进建议吗?
答案 0 :(得分:2)
您正在使用此处未显示的代码中的某些任务调用Result
或Wait
。这会导致经典的ASP.NET(或WinForms / WPF)死锁。等待所有等待。
他们中的许多人已准备好在诉讼结束前完成
您是否尝试并行运行?您的代码不会这样做。 await不会启动任务;它等待已经运行的任务。它结束并行。