我正在研究一种结构类似下面的代码的方法。取消令牌有什么影响?是这样,如果计算时间超过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;
}
答案 0 :(得分:1)
顾名思义,取消令牌可以取消异步/并行代码。考虑用户取消长时间运行流程的情况。
在您的代码中,dosomething
方法接受CancellationToken
,它可以用来确定是否提前取消执行。有各种方法可以做到这一点。首先,您可以在ct.ThrowIfCancellationRequested()
变量上调用ct
,顾名思义,如果操作被取消,它将抛出您可以在调用代码中处理的异常。您还可以在循环中检查if(ct.IsCancellationRequested)
是否已经过,然后退出方法。
通过将Task.Delay(1000, ct);
传递给Task.Delay
,如果在超时之前请求取消,您就会告诉他是否继续等待。
我可能会弄错,但似乎你不确定Task.Delay()
的目的;它是一种在继续之前停止在该行上执行一秒钟的方法。如前所述,如果操作被取消,那么令牌可以提前退出。