Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TakeWhile(…)等扩展方法在RX1.0中是线程安全的吗?_C#_.net_Multithreading_Thread Safety_System.reactive - Fatal编程技术网

C# TakeWhile(…)等扩展方法在RX1.0中是线程安全的吗?

C# TakeWhile(…)等扩展方法在RX1.0中是线程安全的吗?,c#,.net,multithreading,thread-safety,system.reactive,C#,.net,Multithreading,Thread Safety,System.reactive,我有一个由网络I/O频繁触发的事件源,基于底层设计,当然每次事件都在不同的线程上,现在我通过Rx将此事件包装为:Observable。从EventPattern(…),现在我使用TakeWhile(predict)过滤一些特殊的事件数据。 现在,我对它的线程安全性有一些担忧,TakeWhile(predict)作为一个点击和静音,但在并发情况下,它仍然可以得到保证吗?因为我猜底层实现可能是(我无法阅读源代码,因为它太复杂了…): 在我进行测试之前,这里的一些朋友建议我尝试使用Synchroniz

我有一个由网络I/O频繁触发的事件源,基于底层设计,当然每次事件都在不同的线程上,现在我通过Rx将此事件包装为:
Observable。从EventPattern(…)
,现在我使用
TakeWhile(predict)
过滤一些特殊的事件数据。 现在,我对它的线程安全性有一些担忧,
TakeWhile(predict)
作为一个点击和静音,但在并发情况下,它仍然可以得到保证吗?因为我猜底层实现可能是(我无法阅读源代码,因为它太复杂了…):


在我进行测试之前,这里的一些朋友建议我尝试使用
Synchronize
ObserveOn
使其线程安全,那么我的后续想法以及为什么不复制该问题有什么想法吗?

根据您的另一个问题,仍然是一样的:在Rx中,您应该假设以序列化方式调用观察器

提供更好的答案;最初,Rx团队确保可观察到的序列是线程安全的,但是对于行为良好/设计良好的应用程序,性能惩罚是不必要的。因此,我们决定取消线程安全性,以降低性能成本。为了允许您选择返回线程安全,您可以应用
Synchronize()
方法,该方法将序列化所有OnNext/OnError/OnCompleted方法调用。这并不意味着它们将在同一个线程上被调用,但在处理另一个线程时,不会调用
OnNext
方法

坏消息是,从记忆中看,这发生在RX2.0中,您特别询问RX1.0。(我不确定1.xx中是否存在
Synchonize()

因此,如果您在RXV1中,那么您对什么是线程安全的和什么不是线程安全的有模糊的确定性。我非常确定这些主题是安全的,但我不能确定工厂方法,如
FromEventPattern

我的建议是:如果需要确保线程安全,请序列化数据管道。最简单的方法是使用单线程
IScheduler
实现,即DispatchersScheduler或EventLoopScheduler实例

一些好消息是,当我在Rx上写这本书时,它的目标是v1,所以这一部分对你来说非常相关

因此,如果您现在的查询如下所示:

Observable.FromEventPatter(....)
          .TakeWhile(x=>x>5)
          .Subscribe(....);
要确保管道序列化,可以创建EventLoopScheduler(代价是为此指定一个线程):


根据您的另一个问题,问题仍然是一样的:在Rx中,您应该假设以序列化方式调用观察器

提供更好的答案;最初,Rx团队确保可观察到的序列是线程安全的,但是对于行为良好/设计良好的应用程序,性能惩罚是不必要的。因此,我们决定取消线程安全性,以降低性能成本。为了允许您选择返回线程安全,您可以应用
Synchronize()
方法,该方法将序列化所有OnNext/OnError/OnCompleted方法调用。这并不意味着它们将在同一个线程上被调用,但在处理另一个线程时,不会调用
OnNext
方法

坏消息是,从记忆中看,这发生在RX2.0中,您特别询问RX1.0。(我不确定1.xx中是否存在
Synchonize()

因此,如果您在RXV1中,那么您对什么是线程安全的和什么不是线程安全的有模糊的确定性。我非常确定这些主题是安全的,但我不能确定工厂方法,如
FromEventPattern

我的建议是:如果需要确保线程安全,请序列化数据管道。最简单的方法是使用单线程
IScheduler
实现,即DispatchersScheduler或EventLoopScheduler实例

一些好消息是,当我在Rx上写这本书时,它的目标是v1,所以这一部分对你来说非常相关

因此,如果您现在的查询如下所示:

Observable.FromEventPatter(....)
          .TakeWhile(x=>x>5)
          .Subscribe(....);
要确保管道序列化,可以创建EventLoopScheduler(代价是为此指定一个线程):


不,他们不是@TimSchmelter:我的问题是反应式扩展,我不认为你发布的链接是相关的。不,他们不是@TimSchmelter:我的问题是关于被动扩展,我认为您发布的链接是不相关的。:是的,
Synchronize()
do存在于Rx1.0中。如果我的测试总是阳性的,那么它就超出了总是行为线程安全的预期。也许正如您所说,在Rx1.0中,MS已经在内部创建了一个
锁。你能不能再谈一谈
EventLoopScheduler
?我在web上找不到更多信息,创建新线程有什么不同?我在IntroToRx.com上详细介绍了Rx v.1的
EventLoopScheduler
和另一个
isScheduler
s。如果你有信心,那么直接跳到(不过可能最好从一开始就阅读)是的,我阅读了你所有的教程,这非常棒,但是我不能非常理解这个
EventLoopScheduler
,它与
NewThreadScheduler
有什么区别?这两个线程似乎都创建了一个新线程。EventLoopScheduler创建了一个新线程,您可以控制该线程的生存期。NewThreadScheduler每次都会创建一个新线程,除非它是嵌套的调度调用。基本上,如果您想将一个线程专用于某件事情,可以使用EventLoopScheduler。理想情况下,您甚至可以为线程提供一个名称。事实上,为了更好地回答您的问题,
ObserveOn
操作符本身将确保序列被序列化。这样,您不需要特别需要EventLoopScheduler,但如果需要,它将被序列化,并且还将确定值在哪个线程上传播。:Yes,
Synchro
Observable.FromEventPatter(....)
          .TakeWhile(x=>x>5)
          .Subscribe(....);
var scheduler = new EventLoopScheduler();
Observable.FromEventPatter(....)
          .ObserveOn(scheduler)
          .TakeWhile(x=>x>5)
          .Subscribe(....);