【发布时间】:2015-08-05 04:40:09
【问题描述】:
代码:
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 链接:https://dotnetfiddle.net/epqTAG
【问题讨论】:
-
这是你不应该混合你的单子的另一种情况。作为一般规则,您应该将处理保留在
Task<T>或IObservable<T>中,并且仅在绝对需要时才更改 monad。 -
我有一些服务返回 Task
需要以 Rx 方式处理。所以我在这里真的别无选择。 -
没关系。如果你绝对需要那么一切都很好。正是这种来回的变化导致了悲伤。
标签: task-parallel-library system.reactive