我正在使用WinForm,從中我需要的所有進程都被引導。現在我試圖將BackgroundWorker
和ProgressBar
以及取消按鈕集成到我的代碼中。我希望它在本地代碼周圍,而不是單獨的方法。爲了測試這個,一個新的表單用一個進度條(不活動)和一個停止for循環的按鈕來創建。但是,代碼無法正常工作(甚至還沒有包含進度條)。表單立即凍結(見圖),所以我無法測試取消按鈕。然而,for循環被執行並顯示"Done: " + l.ToString()
。我該如何解決這個問題?使用BackgroundWorker凍結表格
void stopMeasurement(object sender, EventArgs e)
{
stopMeas = true;
}
public void testcancel() // Test method which is triggered manually
{
int l = 0;
MetingProgress metingProgress = new MetingProgress();
metingProgress.btnCancelmeting.Click += new EventHandler(stopMeasurement);
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
worker.DoWork += (sender, args) =>
{
for (int k = 0; k < 10; k++)
{
Thread.Sleep(1000);
l++;
if (worker.CancellationPending)
break;
}
MessageBox.Show("Done: " + l.ToString());
};
worker.RunWorkerAsync();
while (worker.IsBusy)
{
if (stopMeas)
worker.CancelAsync();
}
metingProgress.Dispose();
MessageBox.Show("All done");
}
是的,我已經有我的代碼需要進入背景工作的幾個任務,所以我想在我的例子中有一個設置。 for-loop類似於要完成的任務。 – 10a
好的我明白了,那麼'testcancel'實際上是一種簡單地觸發線程並讓它在後臺運行的方法,而這實際上都是要做的。由於線程運行時間較長,因此您不應該嘗試處理這種方法中的表單處理!這將是線程方法的工作。也是'MessageBox.Show(「All done」);'line屬於'DoWork'事件,因爲實際上只有線程本身知道作業何時完成,而不是啓動線程的方法 –