【问题标题】:Suppress exception from Task.Delay()抑制来自 Task.Delay() 的异常
【发布时间】:2017-02-10 06:41:02
【问题描述】:

我有一个异步任务和一个 Task.Delay(time,token) 里面。我从我的主线程对该方法进行了等待调用。每当取消令牌为真时,它都会破坏我的主线程。我需要处理/避免来自 Task.Delay() 的任何异常。有没有可能?

代码 sn-p:

protected override async Task RunAsync(CancellationToken cancellationToken)
    {
        await StartHealthMonitorAsync(cancellationToken);
    }

private async Task StartWorkAsync(CancellationToken cancellationToken)
    {
        var delaySpan = TimeSpan.FromMinutes(1);
        while (!cancellationToken.IsCancellationRequested)
        {
            await Task.Delay(delaySpan, cancellationToken);
            await someTask.DoWorkAsync(cancellationToken);
        }
    }

谢谢

【问题讨论】:

  • “我需要处理/避免来自 Task.Delay() 的任何异常” -- 你真的尝试 来处理异常吗? IE。在await 周围放置try/catch?你就是这样做的。如果你不能让它工作,发布一个好的minimal reproducible example 展示你是如何尝试这样做的,并解释到底发生了什么而不是你想要的。
  • 我尝试使用 try/catch 来处理。但在将取消令牌作为 true 传递时没有得到异常。
  • @JyothisTS,您能展示一下您是如何尝试使用 try/catch 处理它的吗?
  • Task.Delay 将抛出 OperationCanceledException 以取消任务。这怎么会破坏你的主线程?

标签: c# multithreading exception-handling async-await cancellation-token


【解决方案1】:

我需要处理/避免来自 Task.Delay() 的任何异常。有没有可能?

是的。使用catch

protected override async Task RunAsync(CancellationToken cancellationToken)
{
    await StartWorkAsync(cancellationToken);
}

private async Task StartWorkAsync(CancellationToken cancellationToken)
{
  var delaySpan = TimeSpan.FromMinutes(1);
  try
  {
    while (true)
    {
      await Task.Delay(delaySpan, cancellationToken);
      await someTask.DoWorkAsync(cancellationToken);
    }
  }
  catch (OperationCanceledException)
  {
  }
}

我还删除了对IsCancellationRequested 的额外检查,因为它没有必要。

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2015-08-24
    • 2011-12-12
    • 2011-04-19
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多