2016-04-26 14 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

ここに表示されていないコードでは、ResultまたはWaitを呼び出しています。これにより、従来のASP.NET(またはWinForms/WPF)デッドロックが発生します。すべての待機を待ちます。

進行1は

を終える前に、それらの多くは、実行する準備ができているあなたは、並行して物事を実行しようとしていますか?あなたのコードはそれをしません。タスクを開始するのを待っています。すでに実行中のタスクを待ちます。 は、の並列処理を終了します。

+0

ですが、あなたは正しいと思いますが、理由はわかりません。なぜなら、上の呼び出しは.Result()を使用していたからです。 – markokstate