TaskPoolAsyncScheduler.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT License.
  3. // See the LICENSE file in the project root for more information.
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. namespace System.Reactive.Concurrency
  7. {
  8. public sealed class TaskPoolAsyncScheduler : AsyncSchedulerBase
  9. {
  10. private readonly TaskFactory _factory;
  11. public static TaskPoolAsyncScheduler Current { get; } = new TaskPoolAsyncScheduler(TaskScheduler.Current);
  12. public static TaskPoolAsyncScheduler Default { get; } = new TaskPoolAsyncScheduler(TaskScheduler.Default);
  13. public TaskPoolAsyncScheduler(TaskScheduler scheduler)
  14. {
  15. if (scheduler == null)
  16. throw new ArgumentNullException(nameof(scheduler));
  17. _factory = new TaskFactory(scheduler);
  18. }
  19. public TaskPoolAsyncScheduler(TaskFactory factory)
  20. {
  21. _factory = factory ?? throw new ArgumentNullException(nameof(factory));
  22. }
  23. protected override ValueTask Delay(TimeSpan dueTime, CancellationToken token) => new(Task.Delay(dueTime, token));
  24. protected override ValueTask ScheduleAsyncCore(Func<CancellationToken, ValueTask> action, CancellationToken token)
  25. {
  26. var task = _factory.StartNew(() => action(token).AsTask(), token);
  27. task.Unwrap().ContinueWith(t =>
  28. {
  29. if (!t.IsCanceled && t.Exception != null)
  30. {
  31. // TODO: Call event handler.
  32. }
  33. });
  34. return default;
  35. }
  36. }
  37. }