ToTask使OnCompleted在不同的线程上执行



代码:

var sc = new TestScheduler();
Observable.Timer(TimeSpan.FromSeconds(5), sc)
          .ToTask()
          .ToObservable()
          .Do(_ => Console.WriteLine("on next: " + Thread.CurrentThread.ManagedThreadId), 
             () => Console.WriteLine("on complete: " + Thread.CurrentThread.ManagedThreadId))
          .Subscribe();
Console.WriteLine("call: " + Thread.CurrentThread.ManagedThreadId);
sc.AdvanceBy(TimeSpan.FromSeconds(5).Ticks);

输出:

call: 11
on next: 8
on complete: 8

如果同时删除ToTask和ToObservable,那么所有内容都将在同一个线程上执行。在我看来,TPL以某种方式将OnCompleted调度到Task Pool,但我在源代码中找不到它。

有人能帮我了解这里发生了什么吗?

DotNetFiddle链接:https://dotnetfiddle.net/epqTAG

Task.ToObservable()使用Task.ContinueWith()添加任务延续,以在任务完成时触发可观察到的。默认情况下,Task.ContinueWith()在任务池上安排延续。

Rx。Net最近添加了一个接受ISchedulerToObservable过载。

请参见处方。有关更多详细信息,请参阅Net github问题。

相关内容

  • 没有找到相关文章

最新更新