Multithreading 下一个线程安全的被动扩展
使用RxMultithreading 下一个线程安全的被动扩展,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合同要求通知是连续的,对于
主题
,从多个线程调用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)
);