异步DataTable调用

时间:2016-04-26 14:22:46

标签: c# asynchronous async-await task

这是我到目前为止所做的... 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);

任何人都可以看到有什么问题或给我一些更好的前进建议吗?

1 个答案:

答案 0 :(得分:2)

您正在使用此处未显示的代码中的某些任务调用ResultWait。这会导致经典的ASP.NET(或WinForms / WPF)死锁。等待所有等待。

  

他们中的许多人已准备好在诉讼结束前完成

您是否尝试并行运行?您的代码不会这样做。 await不会启动任务;它等待已经运行的任务。它结束并行。