TaskHelpers.cs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
  2. #if !NO_TPL && !NO_TASK_DELAY
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. namespace System.Reactive.Concurrency
  6. {
  7. static class TaskHelpers
  8. {
  9. private const int MAX_DELAY = int.MaxValue;
  10. public static Task Delay(TimeSpan delay)
  11. {
  12. return Delay(delay, CancellationToken.None);
  13. }
  14. public static Task Delay(TimeSpan delay, CancellationToken token)
  15. {
  16. var milliseconds = (long)delay.TotalMilliseconds;
  17. if (milliseconds > MAX_DELAY)
  18. {
  19. var remainder = delay - TimeSpan.FromMilliseconds(MAX_DELAY);
  20. return
  21. #if USE_TASKEX
  22. TaskEx.Delay(MAX_DELAY, token)
  23. #else
  24. Task.Delay(MAX_DELAY, token)
  25. #endif
  26. .ContinueWith(_ => Delay(remainder, token), TaskContinuationOptions.ExecuteSynchronously)
  27. .Unwrap();
  28. }
  29. #if USE_TASKEX
  30. return TaskEx.Delay(delay, token);
  31. #else
  32. return Task.Delay(delay, token);
  33. #endif
  34. }
  35. }
  36. }
  37. #endif