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

ToTask makes OnCompleted execute on different thread

代码:

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 调度到任务池,但我在源代码中找不到它。

谁能帮我理解这是怎么回事?

DotNetFiddle link: https://dotnetfiddle.net/epqTAG

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

Rx.Net 最近添加了 ToObservable 的重载,它接受 IScheduler.

有关详细信息,请参阅 Rx.Net github issue