1

有没有办法巧妙地取消一个长时间运行的后台工作人员,比如说,在超时后?

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

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

4

2 回答 2

1

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

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

如果您想在超时的情况下执行此操作,您可以从计时器事件中调用 CancelAsync。

于 2013-05-02T06:25:34.947 回答
0

有没有办法巧妙地取消一个长时间运行的后台工作人员,比如说,在超时后?

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

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

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

是否有任何“内置”功能可以自动取消长时间运行的任务

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

异步等待 Task<T> 超时完成

或者

如何取消等待超时的任务而不抛出异常

于 2013-05-02T02:24:04.483 回答