首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Reactive.Concurrency.DefaultScheduler

System.Reactive.Concurrency.DefaultScheduler
EN

Stack Overflow用户
提问于 2013-10-01 16:39:11
回答 2查看 1.5K关注 0票数 8

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

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

EN

回答 2

Stack Overflow用户

发布于 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

票数 8
EN

Stack Overflow用户

发布于 2013-10-01 21:57:22

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

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

例如,

这将同步完成:

代码语言:javascript
复制
int result = 0;
Observable.Return(42).Subscribe(v => result = v);
result == 42;

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

代码语言:javascript
复制
int result = 0;
Observable.Return(42, Scheduler.Default).Subscribe(v => result = v);
result == 0;

// some time later
result == 42;
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19111595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档