使用带有取消令牌的 await Task.Delay() 使方法超时
Using await Task.Delay() with Cancellation token to time out a method
我正在寻找一种结构类似于以下代码的方法。取消令牌有什么作用?如果计算时间超过 1 秒,它不会 return 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;
}
顾名思义,取消令牌是允许取消 asynchronous/parallel 代码的东西。考虑用户取消长 运行 过程的场景。
在您的代码中,dosomething
方法接受一个 CancellationToken
,它可用于确定是否提前取消执行。有多种方法可以做到这一点。首先,您可以在 ct
变量上调用 ct.ThrowIfCancellationRequested()
,顾名思义,如果操作被取消,这将引发您可以在调用代码中处理的异常。您还可以在循环中检查 if(ct.IsCancellationRequested)
以查看它是否已经存在,然后退出您的方法。
通过将其传递给 Task.Delay(1000, ct);
,您可以让 Task.Delay
知道如果在超时之前请求取消是否继续等待。
我可能弄错了,但您似乎也不确定 Task.Delay()
的目的;这是一种在继续之前停止在该行上执行一秒钟的方法。如前所述,如果操作被取消,该令牌提供了一种提前退出的方法。
我正在寻找一种结构类似于以下代码的方法。取消令牌有什么作用?如果计算时间超过 1 秒,它不会 return 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;
}
顾名思义,取消令牌是允许取消 asynchronous/parallel 代码的东西。考虑用户取消长 运行 过程的场景。
在您的代码中,dosomething
方法接受一个 CancellationToken
,它可用于确定是否提前取消执行。有多种方法可以做到这一点。首先,您可以在 ct
变量上调用 ct.ThrowIfCancellationRequested()
,顾名思义,如果操作被取消,这将引发您可以在调用代码中处理的异常。您还可以在循环中检查 if(ct.IsCancellationRequested)
以查看它是否已经存在,然后退出您的方法。
通过将其传递给 Task.Delay(1000, ct);
,您可以让 Task.Delay
知道如果在超时之前请求取消是否继续等待。
我可能弄错了,但您似乎也不确定 Task.Delay()
的目的;这是一种在继续之前停止在该行上执行一秒钟的方法。如前所述,如果操作被取消,该令牌提供了一种提前退出的方法。