【问题标题】:Using await Task.Delay() with Cancellation token to time out a method使用带有取消令牌的 await Task.Delay() 来使方法超时
【发布时间】:2017-06-26 20:42:16
【问题描述】:

我正在研究一种结构类似于以下代码的方法。取消令牌的作用是什么?是不是这样如果计算时间超过 1 秒就不会返回 T 并抛出错误?

public async Task<T> doSomething(CancellationToken ct = default(CancellationToken)) {
    await Task.Delay(1000, ct);

    //do something to calculate someT that might take a while

    return someT;
}

【问题讨论】:

  • CancellationToken 用于取消 - 来自 Task.Delay 的任务将被取消,抛出 TaskCanceledException 并且 taht 将取消整个任务
  • Task.Delay 记录在案 - 如何使用以及它的作用
  • @SirRufo 那么这与 NUnit 测试中的 1 秒超时相同吗?
  • 不,这里就像一个 Thread.Sleep (因为你在等待它)但是它可以被令牌取消
  • 我正确理解你,在我计算 someT 的过程中,有两个可能的“路径”基于其他状态,我可以使用 ct 来取消一个路径上的延迟并让它完成但让另一条路径超时?

标签: c# asynchronous task cancellation


【解决方案1】:

顾名思义,取消令牌是允许取消异步/并行代码的东西。考虑用户取消长时间运行的进程的场景。

在您的代码中,dosomething 方法接受一个CancellationToken,它可以用来确定是否提前取消执行。有多种方法可以做到这一点。首先,您可以在ct 变量上调用ct.ThrowIfCancellationRequested(),顾名思义,如果操作被取消,您可以在调用代码中处理该异常。你也可以在循环中检查if(ct.IsCancellationRequested),看看它是否已经存在,然后退出你的方法。

通过将其传递给Task.Delay(1000, ct);,您将向Task.Delay 提供一种方法,告诉您如果在超时之前请求取消,是否继续等待。

我可能弄错了,但您似乎也不确定Task.Delay() 的用途;这是一种在继续之前停止该行执行一秒钟的方法。如果我前面提到的操作被取消,令牌提供了一种提前退出的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多