超时后WPF取消后台Worker

本文关键字:后台 Worker 取消后 取消 WPF 超时 | 更新日期: 2023-09-27 18:11:49

是否有一种方法可以在超时后整齐地取消长时间运行的后台工作线程?

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    ComplexRowContainer crc = (ComplexRowContainer)e.Argument;
    string filename = crc.AppFullPath;
    string calculatedChecksum = BuildChecksum(filename);
    e.Result = calculatedChecksum;
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    string newChecksum = (string)e.Result;
    if (newChecksum.Equals(oldChecksum))
    {
        MessageBox.Show("Same");
    }
    else
    {
        MessageBox.Show("Different");
    }
}

我确实需要修改它来取消事件。但是,是否有任何"内置"可以自动取消长时间运行的任务,或者我应该构建一个计时器来取消超时?谢谢。

超时后WPF取消后台Worker

实际上,BackgroundWorker就是这样做的:

  1. 在启动线程时保持对BackgroundWorker的引用
  2. 在调用RunWorkerAsync之前将WorkerSupportsCancellation设置为true
  3. 当BackgroundWorker运行时,对你保留的引用调用CancelAsync以发出取消的信号。
  4. 在后台例程中,定期检查作为DoWork事件的sender参数的BackgroundWorker实例上的CancellationPending。如果CancellationPending为true,则从事件处理程序返回。

如果你想在超时时这样做,你可以从计时器事件中调用CancelAsync。

是否有一种方法可以巧妙地取消长时间运行的后台工作线程,比如,在暂停之后?

要取消一个后台worker,可以通过set e.Cancel = trueDoWork事件方法中使用DoWorkEventArgs。要取消长时间运行的后台工作器,您需要定义哪个方法需要长时间,并按照Mike Marynowski的评论,您应该使用Task来运行它,并使用CancellationToken来取消长时间运行的任务。

关于取消后台worker的一些信息可以参考:

http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx

是否有任何"内置"的东西可以自动取消一个长时间运行的任务

是的,你可以参考下面的链接。

异步等待Task使用timeout

完成

如何在不抛出异常的情况下取消等待超时的任务