9

在我的应用程序中,我编写了所有要使用的 Rx 代码Scheduler.Default。我想知道指定Scheduler.Default和不指定调度程序之间是否有区别?

采用的策略是System.Reactive.Concurrency.DefaultScheduler什么?

4

2 回答 2

8

Rx 根据加载的平台特定 PlatformServices 使用适当的策略 - 因此您可以在不同的情况下采用不同的方法。OOB 实现查看您的平台上是否有可用的线程,如果可用,则使用线程和平台计时器实现来安排项目,否则它使用任务。例如,后一种情况出现在 Windows 8 应用程序中。

您可以在此处从创建者那里找到有关如何实现平台服务的精彩视频:http: //channel9.msdn.com/Shows/Going+Deep/Bart-De-Smet-Rx-20-RTM-and-RTW

在此处查看有关在您指定和不指定调度程序时内置运算符如何表现的信息:http: //msdn.microsoft.com/en-us/library/hh242963 (v=vs.103).aspx

于 2013-10-01T11:38:28.667 回答
6

Scheduler.Default是的,指定和不指定调度程序是有区别的。使用Scheduler.Default 引入异步和可能的并发行为,而不提供调度程序则由操作员自行决定。有的算子会选择同步执行,有的会选择异步执行,有的会选择跳转线程。

Scheduler.Default提供给每个 Rx 运算符可能是一个坏主意(对于性能甚至可能是正确性,因为过多的并发可能会导致您陷入死锁情况) 。如果您没有特定的调度要求,则不要提供调度程序并让操作员选择它需要的内容。

例如,

这将同步完成:

int result = 0;
Observable.Return(42).Subscribe(v => result = v);
result == 42;

虽然这将异步完成(并且可能在另一个线程上):

int result = 0;
Observable.Return(42, Scheduler.Default).Subscribe(v => result = v);
result == 0;

// some time later
result == 42;
于 2013-10-01T13:57:22.373 回答