2016-06-19 14 views
0

私は、計算とメモリを使用する一連のタスクを実行するためのシミュレーションとして機能するC#Winformsアプリケーションを構築しました。私はバックグラウンドワーカーを使用して作業を行い、UIは応答性を保つことができます。私はループのためだけ持っている:私が望む何バックグラウンドワーカーを連続して実行する

var iterations = Convert.ToInt32(txtNumIterations.Text); 
for (int i = 0; i < iterations; i++) 
{ 
ResetSim(); 
StartWorker("RunSimulation", i + 1); 
} 

だけで、バックグラウンドでこれらの順番に実行することですが、私は設定した背景労働者がこれを実行するかどうかを把握、またはI場合はできませんタスクを使用する必要があります。タスクが自分の目標をどのように達成できるかを説明する本当の良い例は見つかりませんでした。どんな助けもありがとう。

+5

ただ1人のワーカーを使用して、その中に 'for'ループを入れてみませんか? –

+0

@ScottChamberlain、それはまさに私がやることです。私が感じることは、あなたはそれをもっと理由がある答えの原因として掲示すべきです。 – Rahul

答えて

0

シミュレーションを順番に実行する必要がある場合は、バックグラウンドワーカーRunWorkerCompletedイベントを購読して次のイベントを開始することができます。

だから、あなただけのオフ最初のワーカーを起動します。ハンドラで次に

var worker1 = new BackgroundWorker(); 
worker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted; 
worker1.RunWorkerAsync(); 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    var worker2 = new BackgroundWorker(); 
    worker2.RunWorkerCompleted += backgroundWorker2_RunWorkerCompleted; 
    worker2.RunWorkerAsync(); 
} 

明らかにあなたが各ワーカーへの参照を保持する配列を使用し、クラス変数を持つことができますどちらがアクティブであるかを保持する。シミュレーションのカウントをインクリメントしてリストの次のものを開始するには、ハンドラが1つ必要です。

+0

次に、BackGroundWorkerをまったく使用することは何がポイントですか。単純な同期方式ですべてのメソッド/アクションを実行するだけではいかがですか。 – Rahul

+0

@ Rahul - 処理中にUIを反応させて、他のタスクを実行したり、シミュレーションをキャンセルしたりすることができます。 – ChrisF

0

DoWorkメソッドでBackgroundWorker.ReportProgress Methodを使用すると、情報をメインスレッドに戻すことができます。 DoWorkメソッドでループを実行し、各ループでループ変数worker.ReportProgress(i);を呼び出すことができます。値はバックグラウンドワーカーによって解釈されないため、パーセンテージ値である必要はありません。その後、ProgressChangedイベントハンドラでは、ResetSim();を呼び出すことができます。 (私はResetSimがUIで動作すると仮定してUIスレッド上で実行する必要があります)

0

あなたの説明から、実際には複数のバックグラウンドワーカーは必要なく、単一のバックグラウンドワーカーを使用してループを実行するそれの中に。

関連する問題