超时后WPF取消后台工作程序

时间:2013-05-02 02:02:52

标签: c# wpf backgroundworker

有没有办法在超时后整齐地取消长时间运行的后台工作人员?

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");
    }
}

我确实需要修改取消事件。但是,有什么“内置”可以自动取消长时间运行的任务,还是应该构建一个计时器以在超时时取消?感谢。

2 个答案:

答案 0 :(得分:1)

实际上,这是使用BackgroundWorker的方法:

  1. 启动线程时保留对BackgroundWorker的引用
  2. 在调用RunWorkerAsync
  3. 之前将WorkerSupportsCancellation设置为true
  4. 当BackgroundWorker正在运行时,请在您保留的引用上调用CancelAsync,以便发出取消信号。
  5. 在后台例程中,在您获取的BackgroundWorker实例上定期检查CancellationPending作为DoWork事件的sender参数。如果CancellationPending为true,则只从eventhandler返回。
  6. 如果要在超时时执行此操作,则可以从计时器事件中调用CancelAsync。

答案 1 :(得分:0)

  

有没有办法整齐地取消长期运行的后台工作人员,比方说,   超时后?

要取消后台工作人员,您可以通过设置DoWorkEventArgsDoWork事件方法中使用e.Cancel = true。要取消长时间运行的后台工作程序,您需要定义哪一个方法需要很长时间,并遵循Mike Marynowski的注释,您应该使用Task来运行它并使用CancellationToken来取消长时间运行的任务。

有关取消后台工作人员的一些信息,您可以参考:

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

  

有什么“内置”可以自动取消   长期任务

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

Asynchronously wait for Task<T> to complete with timeout

How to cancel a task that is waiting with a timeout without exceptions being thrown