加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在使用SubscribeOn(Scheduler.TaskPool)时避免Rx中的重叠O

发布时间:2020-12-15 03:44:24 所属栏目:百科 来源:网络整理
导读:我有一些代码使用Rx,从多个线程调用: subject.OnNext(value); // where subject is SubjectT 我希望在后台处理这些值,所以我的订阅是 subscription = subject.ObserveOn(Scheduler.TaskPool).Subscribe(value ={ // use value}); 我不太在乎哪些线程处理Obs
我有一些代码使用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
});

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读