TaskUtils.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using System;
  2. using System.Threading.Tasks;
  3. namespace InABox.Core
  4. {
  5. public static class TaskUtils
  6. {
  7. /// <summary>
  8. /// Blocks while condition is true or timeout occurs.
  9. /// </summary>
  10. /// <param name="condition">The condition that will perpetuate the block.</param>
  11. /// <param name="frequency">The frequency at which the condition will be check, in milliseconds.</param>
  12. /// <param name="timeout">Timeout in milliseconds.</param>
  13. /// <exception cref="TimeoutException"></exception>
  14. /// <returns></returns>
  15. public static async Task WaitWhile(Func<bool> condition, int frequency = 25, int timeout = -1)
  16. {
  17. var waitTask = Task.Run(async () =>
  18. {
  19. while (condition()) await Task.Delay(frequency);
  20. });
  21. if (waitTask != await Task.WhenAny(waitTask, Task.Delay(timeout)))
  22. throw new TimeoutException();
  23. }
  24. /// <summary>
  25. /// Blocks until condition is true or timeout occurs.
  26. /// </summary>
  27. /// <param name="condition">The break condition.</param>
  28. /// <param name="frequency">The frequency at which the condition will be checked.</param>
  29. /// <param name="timeout">The timeout in milliseconds.</param>
  30. /// <returns></returns>
  31. public static async Task WaitUntil(Func<bool> condition, int frequency = 25, int timeout = -1)
  32. {
  33. var waitTask = Task.Run(async () =>
  34. {
  35. while (!condition()) await Task.Delay(frequency);
  36. });
  37. if (waitTask != await Task.WhenAny(waitTask,
  38. Task.Delay(timeout)))
  39. throw new TimeoutException();
  40. }
  41. }
  42. }