TaskExt.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. namespace Quadarax.Foundation.Core.Thread.Extensions
  5. {
  6. public static class TaskExt
  7. {
  8. public static async Task<TResult> TimeoutAfter<TResult>(this Task<TResult> task, TimeSpan timeout) {
  9. using (var timeoutCancellationTokenSource = new CancellationTokenSource()) {
  10. var completedTask = await Task.WhenAny(task, Task.Delay(timeout, timeoutCancellationTokenSource.Token));
  11. if (completedTask == task) {
  12. timeoutCancellationTokenSource.Cancel();
  13. return await task; // Very important in order to propagate exceptions
  14. }
  15. throw new TimeoutException("The operation has timed out.");
  16. }
  17. }
  18. public static async Task TimeoutAfter(this Task task, TimeSpan timeout) {
  19. using (var timeoutCancellationTokenSource = new CancellationTokenSource()) {
  20. var completedTask = await Task.WhenAny(task, Task.Delay(timeout, timeoutCancellationTokenSource.Token));
  21. if (completedTask == task) {
  22. timeoutCancellationTokenSource.Cancel();
  23. await task; // Very important in order to propagate exceptions
  24. return;
  25. }
  26. throw new TimeoutException("The operation has timed out.");
  27. }
  28. }
  29. }
  30. }