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。
代码:
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。