一个扩展方法就可以搞定。
// 有返回值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 Task{T} to complete with timeout - Stack Overflow
原文链接: https://blog.jgrass.cc/posts/wait-task-with-timeout/
本作品采用 「署名 4.0 国际」 许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。