Csharp/C#教程:如何让IObservable在订阅时推送最新值分享


如何让IObservable在订阅时推送最新值

通常,当您订阅值的更改时,您也有兴趣知道初始值。 我希望我的IObservable缓存最新(或初始)值并在订阅时推送该值。

当使用普通事件时,我经常会得到类似的代码

x.SomeEvent += SomeEventHandler; SomeEventHandler(x, EventArgs.Empty); 

使用IObservable我希望用推送初始值的东西包装事件。 如果我有多个订阅者,他们应该在订阅时收到最新的值我有一些代码,如果我在创建IObservable后立即订阅,但如果事件在订阅之前触发则不会:

 class Program { static void Main() { var s = new Source { Value = 1 }; var values = Observable.Return(s.Value).Concat( Observable.FromEvent( h => s.ValueChanged += h, h => s.ValueChanged -= h) .Select(_ => s.Value)); using (values.Subscribe(Console.WriteLine)) { s.Value = 2; // prints 1,2 as expected } using (values.Subscribe(Console.WriteLine)) { s.Value = 3; // prints 1,3 - expected 2,3 } } } class Source { private int _value; public int Value { get { return _value; } set { if (_value == value) return; _value = value; if (ValueChanged != null) ValueChanged(this, EventArgs.Empty); } } public event EventHandler ValueChanged; } 

如何创建按预期工作的IObservable?

解决方案是将BehaviorSubject订阅到observable,并将所有观察者订阅到BehaviorSubjectBehaviorSubject将记住最后一个通知,并在订阅时通知新观察者。

看一下具有initialValue参数的Observable.Publish扩展方法。 这将创建一个内部使用BehaviorSubjectIConnectableObservable

 var s = new Source { Value = 1 }; var values = Observable.FromEvent(h => s.ValueChanged += h, h => s.ValueChanged -= h) .Select(e => e.NewValue) .Publish(s.Value); using (values.Connect()) // subscribes subject to event { using (values.Subscribe(Console.WriteLine)) // subscribes to subject { s.Value = 2; } // unsubscribes from subject using (values.Subscribe(Console.WriteLine)) // subscribes to subject { s.Value = 3; } // unsubscribes from subject } // unsubscribes subject from event 

(另)

上述就是C#学习教程:如何让IObservable在订阅时推送最新值分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/991175.html

(0)
上一篇 2021年12月23日
下一篇 2021年12月23日

精彩推荐