在我的应用程序中,我已经编写了使用Scheduler.Default的所有Rx代码。我想知道指定Scheduler.Default和根本不指定调度程序是否有区别?
System.Reactive.Concurrency.DefaultScheduler采用的策略是什么
发布于 2013-10-01 19:38:29
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-01 21:57:22
是的,指定Scheduler.Default和不指定调度程序是有区别的。使用Scheduler.Default将引入异步和可能的并发行为,而不提供调度程序则由操作员自行决定。一些运算符将选择同步执行,而其他运算符将异步执行,而其他运算符将选择跳转线程。
向每个Rx操作符提供Scheduler.Default可能不是一个好主意(对于性能甚至正确性来说,因为过多的并发可能会导致死锁情况)。如果您没有特定的调度要求,那么不要提供调度程序,让操作员选择它需要的。
例如,
这将同步完成:
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;https://stackoverflow.com/questions/19111595
复制相似问题