Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Multithreading 下一个线程安全的被动扩展_Multithreading_C# 4.0_Thread Safety_System.reactive - Fatal编程技术网

Multithreading 下一个线程安全的被动扩展

Multithreading 下一个线程安全的被动扩展,multithreading,c#-4.0,thread-safety,system.reactive,Multithreading,C# 4.0,Thread Safety,System.reactive,使用Rx主题,从多个线程调用OnNext()是否线程安全 因此,序列可以从多个来源生成 合并会做同样的事情吗?否,序列意味着是连续的,因此不允许重叠通知。您可以使用同步扩展方法强制执行正确的同步。像Merge这样的操作符使用锁来调用下游观察器,以确保对on*回调进行正确的串行调用。调用someSubject.OnNext()与someList.Add()一样是线程安全的。您可以从>1个线程调用它,但不能同时调用。将您的OnNext包装在lock语句中,这样就安全了 Rx合同要求通知是连续的,对于

使用Rx
主题
,从多个线程调用
OnNext()
是否线程安全

因此,序列可以从多个来源生成


合并会做同样的事情吗?

否,序列意味着是连续的,因此不允许重叠通知。您可以使用同步扩展方法强制执行正确的同步。像Merge这样的操作符使用锁来调用下游观察器,以确保对on*回调进行正确的串行调用。

调用
someSubject.OnNext()
someList.Add()一样是线程安全的。您可以从>1个线程调用它,但不能同时调用。将您的
OnNext
包装在
lock
语句中,这样就安全了

Rx合同要求通知是连续的,对于几个运营商来说是合乎逻辑的必要条件。也就是说,您可以使用可用的
Synchronize
方法来获得此行为

var subject = new Subject<int>();
var syncedSubject = Subject.Synchronize(subject);            
测试:

Func onNext=i=>()=>syncedSubject.onNext(i);
并行调用
(
onNext(1),
onNext(2),
onNext(3),
onNext(4)
);

可以提供一个使用同步扩展方法的示例?非常有趣的问题!
var observer = Observer.Create<Unit>(...);
var syncedObserver = Observer.Synchronize(observer);
Func<int, Action> onNext = i => () => syncedSubject.OnNext(i);
Parallel.Invoke
(
    onNext(1),
    onNext(2),
    onNext(3),
    onNext(4)
);