我想要运行一个操作,这个操作在n毫秒后应该超时。我有两种实现方式,一种是在等待n毫秒后自己取消操作,另一种是传入一个CancellationToken,在n毫秒后自动过期。
我担心在系统负载过重的情况下,Cancellation Token 可能会在操作开始之前就过期。如果我使用 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));
相较于:
CancellationTokenSource source = new CancellationTokenSource(TimeSpan.FromMilliseconds(n));
await SomeOperationAsync(source.Token);