如何停止其`DoWork`处理程序只包含一个(长期运行)语句的BackgroundWorker?

时间:2015-06-14 09:00:27

标签: c# multithreading backgroundworker cancellation

我遇到BackgroundWorker DoWork处理程序只包含一个语句的问题。这意味着我无法检查CancellationPending标志:

private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    CallTimeConsumerFunction();
}

如何停止此BackgroundWorker?有没有解决办法?

1 个答案:

答案 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);
}                         // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^