2016-06-19 81 views
0

我已經構建了一個C#Winforms應用程序,用作模擬運行一組計算和內存密集型任務。我使用後臺工作人員來完成這項工作,以便UI可以保持響應。我有隻是一個for循環:按順序運行後臺工作人員

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

我想什麼是隻是在後臺運行這些順序,但我想不通,如果後臺工作設置將做到這一點,或者如果我需要使用任務。我還沒有找到一個很好的例子來解釋Task如何實現我的目標。任何幫助,將不勝感激。

+5

爲什麼不只是使用一個工人,並把'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(); 
} 

很明顯,你可以使用一個數組來保存到每個工人的引用,並有一個類變量掌握哪一個人活躍。然後您只需要一個處理程序來增加模擬計數並開始列表中的下一個。

+0

那麼根本就使用BackGroundWorker有什麼意義。爲什麼不以經典的同步方式運行所有的方法/操作? – Rahul

+0

@Rahul - 你可能希望UI在處理時能夠響應,所以你可以做其他任務,取消模擬等。 – ChrisF

0

您可以使用DoWork方法中的BackgroundWorker.ReportProgress Method將信息傳遞迴主線程。您可以在DoWork方法中執行循環,並在循環變量的每個循環中調用worker.ReportProgress(i);。該值不由後臺工作人員解釋,因此它不需要是百分比值。然後在ProgressChanged事件處理程序中,您可以撥打ResetSim();。 (我假設ResetSim在UI中起作用,因此必須在UI線程上執行)。

0

從您的描述中可以看出,您真的不需要多個後臺工作人員,只需使用一個後臺工作人員並運行循環在裏面。