前言
如何实现支持超时的 Task ?
关键点: Task.WhenAny
实现
一个扩展方法就可以搞定.
- // 有返回值
- public static async Task<TResult> TimeoutAfter<TResult>(this Task<TResult> task, TimeSpan timeout)
- {
- using (var timeoutCancellationTokenSource = new CancellationTokenSource())
- {
- var completedTask = await Task.WhenAny(task, Task.Delay(timeout, timeoutCancellationTokenSource.Token));
- if (completedTask == task)
- {
- timeoutCancellationTokenSource.Cancel();
- return await task; // Very important in order to propagate exceptions
- }
- else
- {
- throw new TimeoutException("The operation has timed out.");
- }
- }
- }
- // 无返回值
- public static async Task TimeoutAfter(this Task task, TimeSpan timeout)
- {
- using (var timeoutCancellationTokenSource = new CancellationTokenSource())
- {
- var completedTask = await Task.WhenAny(task, Task.Delay(timeout, timeoutCancellationTokenSource.Token));
- if (completedTask == task)
- {
- timeoutCancellationTokenSource.Cancel();
- await task; // Very important in order to propagate exceptions
- }
- else
- {
- throw new TimeoutException("The operation has timed out.");
- }
- }
- }
参考
- c# - Asynchronously wait for Taskto complete with timeout - Stack Overflow
- [C#] 实现可设置超时的 Task
来源: http://www.bubuko.com/infodetail-2946650.html