TaskExtensions.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using System.Reflection.Metadata.Ecma335;
  2. using Windows.Media.Core;
  3. namespace BluetoothLENet
  4. {
  5. public static class TaskExtensions
  6. {
  7. public static async Task AsTask(this Action action)
  8. {
  9. await Task.Factory.StartNew(action);
  10. }
  11. public static async Task<TResult> AsTask<TResult>(this Func<TResult> action)
  12. {
  13. return await Task.Factory.StartNew(action);
  14. }
  15. public static async Task TimeoutAfter(this Task task, TimeSpan timeout)
  16. {
  17. using (var timeoutCancellationTokenSource = new CancellationTokenSource())
  18. {
  19. var completedTask = await Task.WhenAny(task, Task.Delay(timeout, timeoutCancellationTokenSource.Token));
  20. if (completedTask == task)
  21. {
  22. timeoutCancellationTokenSource.Cancel();
  23. return;
  24. }
  25. else
  26. {
  27. throw new TimeoutException("The operation has timed out.");
  28. }
  29. }
  30. }
  31. public static async Task<TResult> TimeoutAfter<TResult>(this Task<TResult> task, TimeSpan timeout)
  32. {
  33. using var timeoutCancellationTokenSource = new CancellationTokenSource();
  34. var completedTask = await Task.WhenAny(task, Task.Delay(timeout, timeoutCancellationTokenSource.Token));
  35. if (completedTask == task)
  36. {
  37. timeoutCancellationTokenSource.Cancel();
  38. return await task;
  39. }
  40. else
  41. {
  42. throw new TimeoutException("The operation has timed out.");
  43. }
  44. }
  45. }
  46. }