| 1234567891011121314151617181920212223242526272829303132333435363738 |
- using System;
- using System.Threading;
- using System.Threading.Tasks;
- namespace Quadarax.Foundation.Core.Thread.Extensions
- {
- public static class TaskExt
- {
- 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
- }
- 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
- return;
- }
- throw new TimeoutException("The operation has timed out.");
- }
- }
- }
- }
|