用于取消任务并等待其终止的选项

本文关键字:终止 选项 等待 取消 任务 用于 | 更新日期: 2023-09-27 18:32:37

我需要取消挂起的任务并等待其终止,然后代码流才能继续。通常,我这样做:

if (this.task != null)
{
    this.taskCancellationTokenSource.Cancel();
    try
    {
        await this.task;
        // I don't need to know the result, just log it
        Debug.Print(this.task.Status.ToString());
    }
    catch (Exception e)
    {
        // I don't need to know the result, just log it
        Debug.Print(e.ToString());
    }
}

我刚刚意识到我可以在没有try/catch的情况下做同样的事情:

if (this.task != null)
{
    this.taskCancellationTokenSource.Cancel();
    await this.task.ContinueWith(
        // I don't need to know the result, just log it
        (t) => Debug.Print(((object)t.Exception ?? (object)t.Status).ToString()), 
        TaskContinuationOptions.ExecuteSynchronously)
}

是否错过了我应该坚持第一种方法的任何理由?

用于取消任务并等待其终止的选项

是否错过了我应该坚持第一种方法的任何理由?

两个原因,在我的头顶上:

  1. 默认情况下,ContinueWith将使用当前计划程序,这可能会导致并发问题或意外行为。
  2. 当您读取 Task.Exception 属性时,先行任务(在您的示例中t)将具有包装在AggregateException中的任何异常。

我建议使用 await 而不是 ContinueWith,因为它在这两种情况下都有更合理的行为。 await将捕获当前上下文并使用它来安排继续,并且await不会将异常包装在AggregateException中。

如果使用 ContinueWith ,则应始终显式指定运行延续的TaskScheduler