2012-03-14 13 views
0

私はvs2010とローカルデータベースを持つC#windowsアプリケーションで作業しています。私のフォームの1つでは、データベースとReporViewerでいっぱいのテキストボックスのグループでBindingNavigatorを使用しています。私はデータベースに多くのレコードがある場合にテーブルアダプタを埋めるためにバックグラウンドワーカーを追加しました。BackgroundWorker In Form.Loadイベント

問題は、アプリケーションをデバッグするときにバックグラウンドワーカーを使用しているため、テキストボックスにデータが表示されないことです。それ以外の場合はアプリが正常に動作しています。私はこれが非UIスレッド上のUIにアクセスするケースであり、間違っていることを知っています。その周りに別の方法がありますか?事前にありがとうございます。

private void Client_Load(object sender, EventArgs e) 
{ 
    backgroundWorker1.RunWorkerAsync(); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    this.clientTableAdapter.Fill(this.database1DataSet.Client); 
    this.projectTableAdapter.Fill(this.database1DataSet.Project); 

    if (InvokeRequired) 
    { 
     this.Invoke(new MethodInvoker(this.reportViewer1.RefreshReport)); 
     return; 
    } 
} 
+0

デバッグモードで例外がありますか? –

答えて

1

一般的に、バックグラウンドワーカーが同じスレッドに戻って、実際に非UIスレッドに関する例外をスローします:ここで

は、私が使用しているコードです。しかし、これはあなたの場合に食べられるかもしれません。主な作業が完了した後、特にUIの更新を検討するときに発生するアイテムについては、 RunWorkerCompletedイベントを使用する必要があります。そして、この が上記のように(あなたの場合のUI)から呼び出された同じスレッドに戻ります。

私はUI処理コード(RefreshReport)をRunWorkerCompleted用に設定された新しいメソッドに移動します。

しかし、私の提案はTask Parallel Libraryです。 IMOをデバッグするのにコードがはるかにクリーンで簡単になります。

例(ラフとヌルのためにコンパイルされないかもしれないが、あなたはJIST :)取得することができます):私はそれが直接の答えではないですけど、何に向けた提案のより

var task = Task.Factory.StartNew(()=>{//Do Async Stuff}); 
task.ContinueWith((previousTask)=>{//Do your UI Stuff}, null, null, 
    TaskScheduler.FromCurrentSynchronizationContext); 
//The FromCurrentSync makes sure the method returns 
//to the same thread (UI in this case) that it started 

をIよりクリーンでデバッグ可能なアプローチを検討します。

+0

あなたの答えをありがとうが、私は比較的新しいので、私はより直接的な答えが必要です。私の質問は、backgroundWorker_DoWorkイベントでtableadapter.Fill()を使うことができますか?上記のコードは正しいですか? – MarcusV

+0

私はこのようなものを使用しましたが、それはまだ分かりません:public Task FillAync() { return Task.Factory.StartNew(()=> {this.clientTableAdapter.Fill(this.database1DataSet.Client); this .projectTableAdapter.Fill(this.database1DataSet.Project); this.reportViewer1.RefreshReport(); }); } – MarcusV

+0

私はそれをさらに見ています。私はあなたの特定のシナリオのために私の答えを更新します。しかし、私はまだTPLを探してみることを強く勧めます。なぜ古いテクノロジーを使用するのですか? –