7
我想運行一個應該在n毫秒後超時的操作。我已經實現了兩種方法,一種是在等待n毫秒後自行取消操作,另一種方法是傳入CancellationToken集,使其在n毫秒後過期。cancellationtoken超時vs task.delay()和超時
我很擔心,當我的系統承受沉重負載時,在操作甚至開始之前,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));
相比:
CancellationTokenSource source = new CancellationTokenSource(TimeSpan.FromMilliseconds(n));
await SomeOperationAsync(source.Token);
這是在操作甚至開始之前過期CancellationTokenSource的重負載。 – Paparazzi