我有一個後臺工作人員,需要基於複選框的數量被調用多次 - 我寫了這個來獲取複選框的值,並將它們放入List
。RunWorkerAsync關閉完成的BackgroundWorker
List repSelected = new List();
這是填充,然後遍歷像這樣:
foreach (string rep in repSelected)
{
backgroundWorker1.RunWorkerAsync(rep);
backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
}
異步,DoWork的代碼如下所示:
BackgroundWorker worker = sender as BackgroundWorker;
string rep = e.Argument.ToString();
if (worker.CancellationPending == true)
{
e.Cancel = true;
}
else
{
DirectoryExists(rep);
ProcessRunner(rep); //Rars some large files - expensive
}
過程然後運行WorkerComplete,問題是當該過程返回去執行Worker的下一次迭代,它崩潰時表示該worker正忙 - 即使worker已經返回它的WorkerCompleted狀態。
如何確保在循環的下一次迭代之前關閉線程?
注:我有一個包含!backgroundWorker1.IsBusy()
的背景工作條件,但是這(顯然)只是跳過剩餘的迭代而不執行。
非常好,正是我之後,謝謝!出於好奇,是否有可能爲每個項目創建一個新的後臺工作者,但仍然使用相同的代碼來執行? –
您可以將DoWork代碼移動到單獨的方法中,並使用rep值作爲參數。但是,在您的代碼中,似乎您正在處理文件,因此如果將它們放置在機械驅動器(而非SSD)上,那麼如果按順序處理文件,我認爲您的代碼的性能會更好。這是因爲您將避免來回移動磁盤頭。 –
@HenkHolterman使用1 Backgroundworker with parallel.foreach將導致相同的異常。 – daryal