使用具有取消令牌的等待Task.Delay()来超时方法

时间:2017-06-26 20:42:16

标签: c# asynchronous task cancellation

我正在研究一种结构类似下面的代码的方法。取消令牌有什么影响?是这样,如果计算时间超过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;
}

1 个答案:

答案 0 :(得分:1)

顾名思义,取消令牌可以取消异步/并行代码。考虑用户取消长时间运行流程的情况。

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

通过将Task.Delay(1000, ct);传递给Task.Delay,如果在超时之前请求取消,您就会告诉他是否继续等待。

我可能会弄错,但似乎你不确定Task.Delay()的目的;它是一种在继续之前停止在该行上执行一秒钟的方法。如前所述,如果操作被取消,那么令牌可以提前退出。