如何停止其“DoWork”处理程序仅包含一个(长时间运行的)语句的 BackgroundWorker

本文关键字:长时间 运行 包含一 语句 BackgroundWorker 何停止 DoWork 程序 处理 | 更新日期: 2023-09-27 17:55:58

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

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

我怎样才能阻止这个BackgroundWorker?有什么解决方法吗?

如何停止其“DoWork”处理程序仅包含一个(长时间运行的)语句的 BackgroundWorker

查看 .NET 4 的任务并行库 (TPL),它是在 BackgroundWorker 之后推出的,设计得相当不错,可以让你了解应该如何处理这个问题。

TPL中的取消建立在合作取消的思想之上。这意味着任务不会从外部强制停止;相反,他们通过定期检查是否已请求取消来参与取消过程,如果是,则通过"从内部"优雅地中止来参与取消过程。

我建议您效仿 TPL 的示例并实施合作取消。就像这个评论所说,将取消逻辑注入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);
}                         // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^