【问题标题】:.NET Close Task with CancellationToken upon condition.NET 根据条件使用 CancellationToken 关闭任务
【发布时间】:2020-04-04 08:28:53
【问题描述】:

如何正确创建一个带有 CancellationToken 的任务并在某个条件下关闭一个任务?

例如:

CancellationToken CancellationToken = new CancellationTokenSource();

Task.Run(() => {
  try{
    // Get some data from APIs...
    GetDataFromApi();
  }
  catch(Exception ex)
  {
    // So here I want to cancel this task and I do not want any continuation Tasks to run
  }
}, CancellationToken.Token);

我是否需要检查 CancellationToken IsCanceled 或如何正确执行此操作?

谢谢

【问题讨论】:

    标签: .net asp.net-core asynchronous task-parallel-library cancellationtokensource


    【解决方案1】:

    从技术上讲,将任务设置为Canceled 状态的方法是抛出OperationCanceledException 并传递与任务关联的取消令牌(通常通过调用CancellationToken.ThrowIfCancellationRequested() 方法来完成)。但这要求令牌的IsCancellationRequestedtrue。所以达到你想要的效果的一种方法是先取消,然后调用ThrowIfCancellationRequested()

    var cts = new CancellationTokenSource();
    
    Task.Run(() => {
        try
        {
            // Get some data from APIs...
            GetDataFromApi();
        }
        catch (Exception ex)
        {
            cts.Cancel();
            cts.Token.ThrowIfCancellationRequested();
        }
    }, cts.Token);
    

    【讨论】:

    • 我建议抛出一个发生在 try 块内的异常而不是抛出 OperationCanceledException 它将简化调试过程并且会更加清晰
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多