2016-04-26 12 views
0

Hier ist, was ich bisher habe ... FillDataTable() funktioniert gut, aber ich habe Probleme, weil ich synchronen Code und viele Anrufe zu Rücken an Rücken haben. Viele von ihnen sind bereit zu laufen, bevor das Verfahren beendet wird. Versuchen Sie, dies in async/await zu konvertieren. Ich kopierte FillAsync() von anderen Beispielen, die ich gesehen hatte, also könnte es Franken-Code sein.Async DataTable Call

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); }); 
    } 

Wenn ich folgendes in einem async Methode aufrufen, gibt der Code nie.

Kann jemand sehen, was falsch ist oder mir einige Vorschläge für einen besseren Weg nach vorne geben?

+0

In welchem ​​Kontext führen Sie die Anwendung aus? WPF/ASP.NET/Formulare, solche Dinge? – Caramiriel

+0

@Caramiriel Anwendung ist alles WPF – markokstate

Antwort

2

Sie rufen Result oder Wait für eine Aufgabe in Code, der hier nicht angezeigt wird. Dies verursacht den klassischen ASP.NET (oder WinForms/WPF) Deadlock. Verwendung warten auf alle Wartezeiten.

Viele von ihnen sind bereit zu laufen, bevor das Verfahren beendet ein

Sind Sie Dinge parallel laufen zu lassen versuchen? Dein Code tut das nicht. Warten beginnt keine Aufgaben; Es wartet auf Aufgaben, die bereits ausgeführt werden. Es endet Parallelität.

+0

Sie hatten Recht, aber es war sehr verwirrend für mich zu verstehen, warum ... der Anruf darüber war mit .Result(). – markokstate