2017-01-17 8 views
1

まず最初はまだ初心者ですから、少しでも忍耐力があれば感謝します:)BackgroundWorkerが別のBackgroundWorker(C#)を実行するのを待つ方法を教えてください。

私はこのことについて今日とても辛いです。

事は、私は3つの異なるbackgroundworkersを実行したいです。しかし、私は次のものを実行するのが終わるまで待つつもりです。

それぞれのバックグラウンド労働者は、完了までに時間が必要です。私はWaitOne()を使用しています。以前のバックグラウンドワーカーが完了したら、私は新しいUIを実行することができましたが、UIスレッドは3人のバックグラウンド作業者が終了するまでフリーズしています。

私は別のAutoResetEventを設定しています。これは、待機中および実行中のもの全体を処理するものです。ここで

はコードです:

AutoResetEvent _resetRIEvent = new AutoResetEvent(false); 
AutoResetEvent _resetHEvent = new AutoResetEvent(false); 
AutoResetEvent _resetSEvent = new AutoResetEvent(false); 

await Task.Run(() => bgwTestResInd.RunWorkerAsync()); 
_resetRIEvent.WaitOne(); 

await Task.Run(() => bgwTestHipot.RunWorkerAsync()); 
_resetHEvent.WaitOne(); 

await Task.Run(() => bgwTestSurge.RunWorkerAsync()); 
_resetSEvent.WaitOne(); 

MessageBox.Show("Im done for real."); 

はまた、それがこれを行うには許可されているのですか?

private void bgwTestResInd_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    _resetRIEvent.Set(); 
} 


private void bgwTestHipot_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    _resetHEvent.Set(); 
} 


private void bgwTestSurge_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    _resetSEvent.Set(); 
} 
+1

をリセットする順序で実行されます場合にはタスクを使用できるのであればBGWを使用していますか? – Servy

+0

私は実際に初心者のプログラマーです。私は本当にどちらの方が良いかわからない。 – dgls61

答えて

5

むしろちょうど全体のことを行うには最初から最後までTPLを使用して、バックグラウンドワーカーを作成し、異なる時間に労働者を起動するタスクと同期プリミティブの不自然なミックスを使用するよりも:

await Task.Run(() => TheWorkThatTheFirstBGWWasDoing()); 
await Task.Run(() => TheWorkThatTheSecondBGWWasDoing()); 
await Task.Run(() => TheWorkThatTheThirdBGWWasDoing()); 

あるいは、すべての操作は、CPUバウンドの仕事であれば、あなたは、単にTask.Runへの単一の呼び出しを使用することができます完了

await Task.Run(() => 
{ 
    TheWorkThatTheFirstBGWWasDoing()); 
    TheWorkThatTheSecondBGWWasDoing()); 
    TheWorkThatTheThirdBGWWasDoing()); 
}); 

を。

あなたは本当にそして、あなたがする必要があるすべては、コールRunWorkerAsyncが、それは待つ必要があるとBGWの完了ハンドラである(そこには本当の正当な理由ではありませんが、とにかく)バックグラウンドワーカーを使用する必要がある場合は、最初の人がやっている仕事をする単一のBGWを持っていて、次に2人目の人がやる必要のある仕事をして、3人目の人がやる必要のある仕事をしてください。

+0

ありがとうServy。私はまだ初心者なので、いくつかのことをやる方法を選ぶことにはまだまだ問題があります。 – dgls61

-1

あなたはまだここにそこにあなたの計画にしたいスティックコード

class Program 
{ 

    static void Main(string[] args) 
    { 

     var test=new Test(); 
     test.Run(); 
     Console.ReadKey(); 
    } 

    private class Test 
    { 
     AutoResetEvent _resetRIEvent = new AutoResetEvent(false); 
     AutoResetEvent _resetHEvent = new AutoResetEvent(false); 
     AutoResetEvent _resetSEvent = new AutoResetEvent(false); 

     private BackgroundWorker bgwTestResInd = new BackgroundWorker(); 
     private BackgroundWorker bgwTestHipot=new BackgroundWorker(); 
     private BackgroundWorker bgwTestSurge=new BackgroundWorker(); 
     public async void Run() 
     { 
      bgwTestResInd.DoWork += BgwTestResInd_DoWork; 
      bgwTestHipot.DoWork += BgwTestHipot_DoWork; 
      bgwTestSurge.DoWork += BgwTestSurge_DoWork; 

      await Task.Run(() => bgwTestResInd.RunWorkerAsync()); 
      _resetRIEvent.WaitOne(); 


      await Task.Run(() => bgwTestHipot.RunWorkerAsync()); 
      _resetHEvent.WaitOne(); 

      await Task.Run(() => bgwTestSurge.RunWorkerAsync()); 
      _resetSEvent.WaitOne(); 

      Console.Write("Done"); 
     } 

     private void BgwTestHipot_DoWork(object sender, DoWorkEventArgs e) 
     { 
      Console.WriteLine("BgwTestHipot done.."); 
      _resetHEvent.Set(); 
     } 

     private void BgwTestSurge_DoWork(object sender, DoWorkEventArgs e) 
     { 
      Console.WriteLine("BgwTestSurge done.."); 
      _resetSEvent.Set(); 
     } 

     private void BgwTestResInd_DoWork(object sender, DoWorkEventArgs e) 
     { 
      Console.WriteLine("BgwTestResInd done.."); 
      _resetRIEvent.Set(); 
     } 
    } 
} 

だけのメソッドをDoWorkするようにコードを追加し、彼らはあなたがなぜあなたはあなたのAutoResetEvents

+0

これは、UIがブロックされている問題を解決するものではありません。 – Servy

関連する問題