如何停止其“DoWork”处理程序仅包含一个(长时间运行的)语句的 BackgroundWorker
本文关键字:长时间 运行 包含一 语句 BackgroundWorker 何停止 DoWork 程序 处理 | 更新日期: 2023-09-27 17:55:58
我对DoWork
处理程序仅包含一个语句的BackgroundWorker
有问题。这意味着我无法检查CancellationPending
标志:
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
CallTimeConsumerFunction();
}
我怎样才能阻止这个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);
} // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^