我想运行一个应该在n毫秒后超时的操作.我已经实现了两种方法,一种是在等待n毫秒后自己取消操作,另一种是在n毫秒后将CancellationToken设置传递到期.
我担心当我的系统负载很重时,canceltoken可能会在操作开始之前到期.看来如果我自己使用Task.Delay()实现超时,那么在我的操作开始之后,Delay()调用才会运行.
我是这样做的:
public static async Task<T> TimeoutAfter<T>(this Task<T> task, TimeSpan timeout)
{
Task completedTask = await Task.WhenAny(task, Task.Delay(timeout));
if (completedTask == task)
{
return await task;
}
throw new TimeoutException();
}
// Use it like this
await SomeOperationAsync().TimeoutAfter(TimeSpan.FromMilliseconds(n));
Run Code Online (Sandbox Code Playgroud)
相比:
CancellationTokenSource source = new CancellationTokenSource(TimeSpan.FromMilliseconds(n));
await SomeOperationAsync(source.Token);
Run Code Online (Sandbox Code Playgroud)