我正在使用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'事件,因为实际上只有线程本身知道作业何时完成,而不是启动线程的方法 –