TaskPoolAsyncScheduler.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. if (factory == null)
  22. throw new ArgumentNullException(nameof(factory));
  23. _factory = factory;
  24. }
  25. protected override Task Delay(TimeSpan dueTime, CancellationToken token) => Task.Delay(dueTime, token);
  26. protected override Task ScheduleAsyncCore(Func<CancellationToken, Task> action, CancellationToken token)
  27. {
  28. var task = _factory.StartNew(() => action(token), token);
  29. task.Unwrap().ContinueWith(t =>
  30. {
  31. if (!t.IsCanceled && t.Exception != null)
  32. {
  33. // TODO: Call event handler.
  34. }
  35. });
  36. return Task.CompletedTask;
  37. }
  38. }
  39. }