TaskHelpers.cs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  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, CancellationToken token)
  11. {
  12. var milliseconds = (long)delay.TotalMilliseconds;
  13. if (milliseconds > MAX_DELAY)
  14. {
  15. var remainder = delay - TimeSpan.FromMilliseconds(MAX_DELAY);
  16. return
  17. #if USE_TASKEX
  18. TaskEx.Delay(MAX_DELAY, token)
  19. #else
  20. Task.Delay(MAX_DELAY, token)
  21. #endif
  22. .ContinueWith(_ => Delay(remainder, token), TaskContinuationOptions.ExecuteSynchronously)
  23. .Unwrap();
  24. }
  25. #if USE_TASKEX
  26. return TaskEx.Delay(delay, token);
  27. #else
  28. return Task.Delay(delay, token);
  29. #endif
  30. }
  31. }
  32. }
  33. #endif