Task parallel library ToTask使OnCompleted在不同的线程上执行
代码:Task parallel library ToTask使OnCompleted在不同的线程上执行,task-parallel-library,system.reactive,Task Parallel Library,System.reactive,代码: var sc=newtestscheduler(); 可观测计时器(时间跨度从秒(5),sc) .ToTask() .TooObservable()文件 .Do(=>Console.WriteLine(“下一步:”+Thread.CurrentThread.ManagedThreadId), ()=>Console.WriteLine(“完成时:+Thread.CurrentThread.ManagedThreadId)) .Subscribe(); WriteLine(“调用:”+Th
var sc=newtestscheduler();
可观测计时器(时间跨度从秒(5),sc)
.ToTask()
.TooObservable()文件
.Do(=>Console.WriteLine(“下一步:”+Thread.CurrentThread.ManagedThreadId),
()=>Console.WriteLine(“完成时:+Thread.CurrentThread.ManagedThreadId))
.Subscribe();
WriteLine(“调用:”+Thread.CurrentThread.ManagedThreadId);
sc.AdvanceBy(时间跨度从秒(5)开始,滴答声);
输出:
call: 11
on next: 8
on complete: 8
如果同时删除ToTask和ToObservable,那么所有内容都将在同一个线程上执行。在我看来,TPL计划不知何故没有完成到任务池中,但我在源代码中找不到它
有人能帮我理解这里发生了什么吗
DotNetFiddle链接:Task.ToObservable()
使用Task.ContinueWith()
添加任务延续,以在任务完成时触发可观察内容。默认情况下,Task.ContinueWith()
Rx.Net最近添加了一个超负荷的ToObservable
,它接受IScheduler
有关更多详细信息,请参阅Rx.Net。这是另一种情况,您不应混合使用单子。一般来说,你应该在Task
或IObservable
中进行处理,只有在你绝对需要的情况下才能更改monad。我有一些服务返回任务,需要以Rx方式进行处理。所以我没有选择的余地,没关系。如果你真的需要那么一切都好。正是这种来回的变化导致了悲伤。