2016-07-20 39 views
1

DataSetに5つのDataTableを埋め込むDataAdapterがあります。DataAdapter.Fill()を非同期で使用する方法

SqlDataAdapter da = new SqlDataAdapter("Select * from testTable",con); 
da.Fill(ds, 0, numberOfRowsToPutInEachDataTable, "DT1"); 
da.Fill(ds, numberOfRowsToPutInEachDataTable , numberOfRowsToPutInEachDataTable , "DT2"); 
da.Fill(ds, numberOfRowsToPutInEachDataTable* 2, numberOfRowsToPutInEachDataTable, "DT3"); 
da.Fill(ds, numberOfRowsToPutInEachDataTable * 3, numberOfRowsToPutInEachDataTable, "DT4"); 
da.Fill(ds, numberOfRowsToPutInEachDataTable * 4, numberOfRowsToPutInEachDataTable, "DT5"); 

私の目標は、各

da.Fill... 

は同時に、非同期で実行するために取得することです。

私は非同期で動作する経験はなく、研究を通して解決策を見つけるのは苦労しています。誰も私がこれらのDataAdapter.Fill()をそれぞれ非同期で実行する方法を私に教えてもらえますか?

+0

ここにいくつかの行を入れたり、他の行をそこに置くのではなく、それらをすべて読み込んで、500ページのページでそれらを表示することができます。それが、それらを切り刻む理由ならば、 – Plutonix

+3

' DataAdapter'。問題を解決するにはより良い方法があるかもしれませんが、タスクに制限されます。 –

+0

同時に走らせることが私の唯一の必要条件です。 – Reeggiie

答えて

0

どうPLINQの使用に関する:

SqlDataAdapter da = new SqlDataAdapter("Select * from testTable", con); 

IEnumerable<int> results = new string[] 
{ 
    "DT1", "DT2", "DT3", "DT4", "DT5" 
} 
.AsParallel() 
.Select((table, index) => da.Fill(ds, 
          numberOfRowsToPutInEachDataTable * index, 
          numberOfRowsToPutInEachDataTable, 
          table)); 

EDIT

提案された解決策は間違いなくお勧めしません。

DataSetは、同時書き込み操作をサポートしていないことが表示されます:

この型は、マルチスレッド読み取り操作に対して安全です。 書き込み操作を同期させる必要があります。

+1

これはエラーなく実行されますが、この5つのデータセットはこの実行の最後に空のままです。私が変更する必要があるものはありますか? – Reeggiie

+0

@Reeggiie更新された回答を参照してください。 DataSetは、同時書き込みアクセスをサポートしていません。 –

1

あなたが複数Task.Run()このように複数のスレッドを使用することができます。

Task.Run(() => 
{ 
    da1.Fill(ds.Table1); 
    this.Invoke(new Action(() => {dataGridView1.DataSource = ds.Table1;})); 
}); 
Task.Run(() => 
{ 
    da2.Fill(ds.Table2); 
    this.Invoke(new Action(() => {dataGridView2.DataSource = ds.Table2;})); 
}); 

データがフォームを凍結することなく、同時に2つの異なるスレッドを使用してロードされますこの方法です。

上記のコードでは、da1.Fillda2.Fillは同時に異なるスレッドを呼び出します。コードがUIスレッドとは異なるスレッドを実行しているため、DataSourceDataGridViewに設定する場合は、Invokeを使用する必要があります。

+0

は本当にネセサリーであり続けますか? 'Task.Run'ランバダの中に' this.Invoke'を入れてください。 –

+0

@ScottChamberlainはい、あなたは 'ContinueWith'について正しいです、私たちはそれを必要としません。私はそれを訂正した。しかし、単一の 'DataSet'の異なる' DataTable'オブジェクトにアクセスすることについては、問題を引き起こす可能性があるかどうかはわかりません。 –

関連する問題