代码:
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最近添加了一个接受IScheduler
的ToObservable
过载。
请参见处方。有关更多详细信息,请参阅Net github问题。