我的应用程序使用后台工作程序在循环内做一些工作 . 我有它,所以在每次循环迭代时,它检查取消挂起是否为真,如果是,则打破循环 . 好的,我的应用程序一旦完成循环的当前迭代就会停止处理 . 问题是我认为后台工作程序仍然在运行 - 如果我单击按钮再次开始处理,我会收到一个错误,说后台工作人员正忙 .
我打算处理这个工作人员,但是当表单运行时就会创建它,所以如果我处理它,那就不能再开始工作了 . 我真正想做的是告诉后台工作人员它是完整的,如果我点击“停止处理”按钮,那么当我点击开始按钮时它就可以再次开始处理了!
我打算尝试这个:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (!backgroundWorker1.CancellationPending)
{
// Start processing in a background thread so the GUI remains responsive,
// pass in the name of the text file produced by
// PFDR FilenameLogic(txtLetterType.Text);
}
}
4 回答
与Marc Gravell相同的答案,但你似乎没有遵循 .
你在设置e.cancel = true吗?
创建工作线程时,将
worker.WorkerSupportsCancellation
设置为true
. 现在在DoWork
处理程序中,您必须定期(最常见的是,在某个循环开始时等)检查worker.CancellationPending
- 如果为true,则设置e.Cancel = true;
(以便您可以区分完成和取消),清理并退出(return;
) . 现在您的取消按钮可以调用worker.CancelAsync();
并且它将采取适当的行动 .我几乎没有找到一个很好的方法如何取消 Backgroundworker Stop Button :
我的应用程序看起来像这样,两个按钮和一个进度条:
按下“停止”按钮后,它看起来像这样:
对于“开始”按钮单击方法,代码会检查BGW是否正忙 . 如果没有启动BGW:
停止按钮调用以下方法,该方法将标志 CancellationPending 设置为true:
此标志可以在backgroundWorker1 _DoWork 方法中使用,该方法负责处理高耗时的功能:
现在是棘手的部分,因为在关闭额外的线程之前,你必须检查backgroundWorker1 _ProgressChanged 中的 e 对象是否被取消!!!!!否则你会得到 Error .
Extra information: 别忘了设置这些Backgroundworker标志:
如果这个小教程很有帮助 - >拇指向上
我似乎已经解决了错误 - 在Backgroundworker DoWork方法中,我放了一段时间取消不正确,当它是真的我设置e.Cancel = true它现在似乎工作正常!