我有一些代码使用Rx,从多个线程调用:
subject.OnNext(value); // where subject is Subject<T>
subscription = subject.ObserveOn(Scheduler.TaskPool).Subscribe(value => { // use value });
我不太在乎哪些线程处理Observable中出现的值,只要将工作放入TaskPool中,并且不阻止当前线程.但是,我在OnNext委托中使用’value’不是线程安全的.目前,如果观察器中有很多值正在进行,我将重新调用OnNext处理程序.
我可以添加一个锁到我的OnNext委托,但这不像Rx的做事方式.当我有多个线程调用subject.OnNext(value)时,最好的方法是确保我一次只调用一次OnNext处理程序;?
解决方法
从MSDN上的
Using Subjects
By default,subjects do not perform any synchronization across
threads. […] If,however,you want to
synchronize outgoing calls to observers using a scheduler,you can use
the Synchronize method to do so.
所以,如同布兰登在评论中所说的那样,你应该同步主题并将其传递给制作人员线程.例如
var syncSubject = Subject.Synchronize(subject); // syncSubject.OnNext(value) can be used from multiple threads subscription = syncSubject.ObserveOn(TaskPoolScheduler.Default).Subscribe(value => { // use value });
原文地址:https://www.jb51.cc/csharp/93875.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。