2016-04-26 125 views
0

这是我到目前为止... FillDataTable()工作得很好,但我遇到了问题,因为我有同步代码和大量的电话连续进行。他们中的很多人都准备好在程序完成之前运行。试图将其转换为async/await。我从我看过的其他例子中复制了FillAsync(),所以它可能是弗兰肯代码。异步DataTable拨打电话

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

在什么情况下运行应用程序? WPF/ASP.NET/Forms,这样的事情? – Caramiriel

+0

@Caramiriel应用程序是所有WPF – markokstate

回答

2

您正在致电ResultWait对代码中的某些任务没有显示。这会导致传统的ASP.NET(或WinForms/WPF)死锁。等待所有等待。

他们中许多人都准备好运行程序完成一个

你们是不是并行运行以前的事情?你的代码不会那样做。等待不会开始任务;它等待已经运行的任务。它结束并行。

+0

你是对的,但我很明白为什么......上面的调用使用.Result()。 – markokstate