【发布时间】:2014-06-21 23:55:45
【问题描述】:
我想运行一个应该在 n 毫秒后超时的操作。我有两种实现方式,一种是在等待 n 毫秒后自己取消操作,另一种是传入设置为在 n 毫秒后过期的 CancellationToken。
我担心当我的系统负载过重时,取消令牌可能会在操作开始之前过期。看来,如果我自己使用 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);
【问题讨论】:
-
在操作开始之前使 CancellationTokenSource 过期是一项繁重的工作。
标签: .net task-parallel-library