2016-07-18 17 views
1

古いWinForms/ADOアプリケーションのデータアクセスレイヤーを変更して、非同期の開発環境の残りのAPIを使用してSalesforceオブジェクトをsoqlで取得します。次のアプローチは、一般的に決して私の13件のテーブル・ルーチンの1つを除いて、機能していないAddMyTableRow(System.Data.DataRowCollection.Add())メソッドから返されます。WindowsフォームのDataTableにデータを非同期でロードする

public void LoadData() { 
    var tasks = new List<Task<int>> { 
     GetObject1Async(), 
     GetObject2Async(),... 
     GetObject13Async() 
    }; 
    Task.WaitAll(tasks.ToArray()); 
    //do some postprocessing now that I have all the data 
} 

async Task<int> GetObject1Async(){ 
    var response = await cnx.QueryAsync<dynamic>("SELECT foo FROM bar").ConfigureAwait(false); 
    foreach (var rec in response.Records){ 
     var row = MyDataSet.MyTable.NewMyTableRow(); 
     row.Name = rec.Name; ... 
     MyDataSet.MyTable.AddMyTableRow(row); //<== Sometimes this never returns 
    } 
    return MyDataSet.MyTable.Count; 
} 

このさえ正しいアプローチですか?

私は、全体をコメントアウトすれば、cnx.Query ...行を待って、ちょうどAddMyTableRow(dummyData)を呼び出すことがわかりました。どのような種類の非同期/スレッディング/コンテキストがあるように感じますが、何のエラーも例外も発生しないので、何を実行するのか分かりません。

乾杯、 ジェフ

答えて

5

あなたは非同期形式で、その後Loadイベントハンドラまたはあなたはデータバインディングを実行する非同期方式でのTask<DataTable>を返し、非同期メソッドを持つことができ、それを呼び出す待って、その後、使用結果はグリッドにバインドされます。

public async Task<DataTable> GetDataAsync() 
{ 
    var dt = new DataTable(); 
    var cn = @"Your Connection String"; 
    var cmd = @"SELECT * FROM Category"; 
    var da = new SqlDataAdapter(cmd, cn); 
    await Task.Run(() => { da.Fill(dt); }); 
    return dt; 
} 

private async void Form1_Load(object sender, EventArgs e) 
{ 
    var data = await GetDataAsync(); 
    this.dataGridView1.DataSource = data; 
} 
関連する問題