我遇到BackgroundWorker
DoWork
处理程序只包含一个语句的问题。这意味着我无法检查CancellationPending
标志:
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
CallTimeConsumerFunction();
}
如何停止此BackgroundWorker
?有没有解决办法?
答案 0 :(得分:4)
查看.NET 4的任务并行库(TPL),它位于BackgroundWorker
之后且设计得很好,可以让您了解如何处理这个问题。
Cancellation in the TPL is built on the idea of cooperative cancellation。这意味着任务不会被强制从外部停止;相反,他们通过定期检查是否已经请求取消参与取消过程,如果是,则通过从内部优雅地中止"#34;
我建议您遵循TPL的示例并实施合作取消。与this comment状态一样,将取消逻辑注入CallTimeConsumerFunction
。例如:
void CallTimeConsumerFunction(Func<bool> shouldCancel)
{ // ^^^^^^^^^^^^^^^^^^^^^^^
// add this; can be called to find out whether to abort or not
… // possibly lengthy operation
if (shouldCancel()) return;
… // possibly lengthy operation
}
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
CallTimeConsumerFunction(shouldCancel: () => backgroundWorker.CancellationPending);
} // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^