2016-05-23 16 views
2

ログを収集するためにWPFアプリケーションを作成しています。いくつかのスクリプトを実行するために異なるBackgroundworkerを使用しています。スクリプト1の場合はWorker1、スクリプト2の場合はWorker2などとなります。 Backgroundworkerが完了するとRunworkerCompletedメソッドが実行されます。複数のバックグラウンドワーカーが完了し、UIスレッドを更新するかどうかを確認する方法?

だから、どのようにすべての労働者が完了するのを待つことができますか?これらの作業者がすべて完了したら、UIスレッドを更新する必要があります。

+0

あなたはMVVMを使用しての代わりに、UIを更新する必要があります。 – Aron

+0

ねえ、答えが助けましたか? –

答えて

1

タスクを試すことができます。

Task t1 = Task.Run(() => 
    { 
     // Do something 
    } 
); 

Task t2 = Task.Run(() => 
    { 
     // Do something 
    } 
); 

Task t3 = Task.Run(() => 
    { 
     // Do something 
    } 
); 

await Task.WhenAll(new Task[] { t1, t2, t3 }).ContinueWith((task) => 
    { 
     // Do something when all three tasks have completed... 
    }   
); 
0

ここではすべてのBackgroundWorkerオブジェクトが完成するまで待つ方法です。私はあなたがC#を使用している願っています:

上記とは別に
static void Main(string[] args) 
    { 
     int noOfbackgroundWorker = 5; 
     WaitHandle[] waitHandles = new WaitHandle[noOfbackgroundWorker]; 
     Stopwatch sw = new Stopwatch(); 
     sw.Start(); 
     for (int i = 0; i < noOfbackgroundWorker; i++) 
     { 
      var bg1 = new BackgroundWorker(); 
      var handle = new EventWaitHandle(false, EventResetMode.ManualReset); 
      bg1.DoWork += delegate(object sender, DoWorkEventArgs e) { Thread.Sleep(i * 1000); }; 
      bg1.RunWorkerCompleted += delegate(object sender, RunWorkerCompletedEventArgs e) { handle.Set(); }; 
      waitHandles[i] = handle; 
      bg1.RunWorkerAsync(); 
     } 

     WaitHandle.WaitAll(waitHandles); 
     Console.WriteLine("Done in "+sw.Elapsed.Seconds + " seconds"); 
     Console.ReadKey(); 
    } 

BackgroundWorkerのない低いがない場合、単に各ワーカーは、各ワーカー完全な状態をマッピングし、そのすべてのRunworkerCompletedイベントハンドラから、共通のメソッドを呼び出すためのbool変数を設定します渡された場合はif(a && b && c.....)の条件があり、UIに通知してください。

0

私はTask.Run vs BackgroundWorker conclusionで言うように:waiting for two separate background operations to complete before doing something elseよう

何がTask.Runとはるかに簡単です。いつでもあなたは の操作を行う必要があります。

(これは、series of blog posts comparing Task.Run to BackgroundWorkerの結論である)。

ワーキングスクリプト1、ワーカー2スクリプト2など。

あなたはTask.Runでこれを行うことができます。

Result DoWork(Script script) { ... } 

IEnumerable<Script> scripts = ...; 
var tasks = scripts.Select(x => Task.Run(() => DoWork(x))).ToList(); 

をだから、どのように私は完了するためにすべての労働者のために待つことができますか?これらのすべてのワーカーが完了したら、UIスレッドを更新する必要があります。

使用awaitTask.WhenAll

var results = await Task.WhenAll(tasks); 
... // Update UI with results 
関連する問題