【问题标题】:How to create an Observable "channel" in Rx?如何在 Rx 中创建一个可观察的“通道”?
【发布时间】:2018-09-05 18:49:39
【问题描述】:

我开始使用 Reactive Extensions 将我的 push -> pull 桥转变为更简单的结构。

所以现在我有一个带有(私人)事件的类,并从中创建了一个 Observable

class WithEvents {
   public class MyEvent {}
   private delegate void MyEventHandler(MyEvent e);
   private event MyEventHandler EventRaised;

   Public IObservable<MyEvent> TheEvents;

   public void Foo() {
      EventRaised(new MyEvent());
   }

}

问题是,这个事件在这里看起来像是不需要的脚手架。所以我想知道:有没有办法构建一个“裸”的 Observable,我可以将事件“推送”到?

class WithChannel {
    public class MyEvent {}
    public IObservable<MyEvent> EventRaised {get} = new Channel<MyEvent>();

    public void Foo() {
       ((Channel)EventRaised).DoNext(new MyEvent());
    }
}

【问题讨论】:

    标签: c# events system.reactive channels


    【解决方案1】:

    是的,有一个叫做 Subject(在 System.Reactive.Subjects 命名空间中)的东西就是这样做的:

    class WithChannel {
        public class MyEvent {
        }
    
        private readonly Subject<MyEvent> _event;
    
        public WithChannel() {
            _event = new Subject<MyEvent>();
        }
    
        public IObservable<MyEvent> EventRaised => _event;
    
        public void Foo() {
            _event.OnNext(new MyEvent());
        }
    }
    

    一般不建议使用主题,但对于这个特定的任务,我认为这很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 2020-04-02
      • 1970-01-01
      • 2017-08-16
      相关资源
      最近更新 更多