C#中的IObserver和IObservable用于观察者和代理,事件我要做的就是实现观察者模式。所以,我想到了这个解决方案:我们有一个PoliceHeadQuarters,它的主要工作是向所有订阅者发送通知。考虑到DSP,Inspector和SubInspector类订阅了PoliceHeadQuarters。我使用事件和委托编写了publicclassHeadQuarters{publicdelegatevoidNewDelegate(objectsender,EventArgse);公共事件EventHandlerNewEvent;publicvoidRaiseANotification(){varhandler=this.NewEvent;if(handler!=null){handler(this,newEventArgs());}}}publicclassSubInspector{publicvoidListen(objectsender,EventArgse){MessageBox.Show(string.Format("发件人收到的事件通知={0}witheventArguments={1}",sender,e.ToString()));}}publicclassInspector{publicvoidListen(objectsender,EventArgse){MessageBox.Show(string.Format("发件人收到的事件通知={0}witheventArguments={1}",sender,e.ToString()));我就是这样称呼它的varheadQuarters=newHeadQuarters();varSubInspector=newSubInspector();varInspector=newInspector();headQuarters.NewEvent+=Inspector.Listen;headQuarters.NewEvent+=SubInspector.Listen;headQuarters.RaiseANotification();因此,每当调用函数RaiseANotification()时,我nspector和SubInspector类都被通知DotNetFramework4,4.5似乎支持一种称为IObserver和IObservable的新方法。谁能为我提供一个针对上述场景使用IObservable和IObserver模式的超级简单示例?google了一下,发现网上的例子都比较臃肿难懂。我的想法:(可能我认为这是错误的)DSP类:IObserver//因为它观察总部?classPoliceHeadQuarters:IObservable//因为这是我们发送通知的地方?提前致谢。编辑:有人还说MSDN文档对于IObservable@IObservable与PlainEvents也不正确,或者我为什么要使用IObservable?.以下是适合您的框架的MSDN示例的修改:publicstructMessage{stringtext;publicMessage(stringnewText){this.text=newText;}publicstringText{get{returnthis.text;}}}publicclassHeadquarters:IObservable{publicHeadquarters(){observers=newList>();私人名单>观察员;publicIDisposableSubscribe(IObserverobserver){if(!observers.Contains(observer))observers.Add(observer);返回新的取消订阅者(观察者,观察者);}privateclassUnsubscriber:IDisposable{privateList>_observers;私人IObserver_observer;publicUnsubscriber(List>observers,IObserverobserver){this._observers=observers;this._observer=观察者;}publicvoidDispose(){if(_observer!=null&&_observers.Contains(_observer))_observers.Remove(_observer);}}publicvoidSendMessage(Nullableloc){foreach(varobserverinobservers){if(!loc.HasValue)observer.OnError(newMessageUnknownException());elseobserver.OnNext(loc.Value);}}publicvoidEndTransmission(){foreach(varobserverinobservers.ToArray())if(observers.Contains(observer))observer.OnCompleted();观察者.Clear();}}publicclassMessageUnknownException:Exception{内部MessageUnknownException(){}}publicclassInspector:IObserver{privateIDisposableunsubscriber;私有字符串instName;publicInspector(stringname){this.instName=name;}publicstringName{get{returnthis.instName;}}publicvirtualvoidSubscribe(IObservableprovider){if(provider!=null)unsubscriber=provider.Subscribe(this);}publicvirtualvoidOnCompleted(){Console.WriteLine("总部已完成向{0}传输数据。",this.Name);这个。取消订阅();}publicvirtualvoidOnError(Exceptione){Console.WriteLine("{0}:无法从总部获取消息。",this.Name);}publicvirtualvoidOnNext(Messagevalue){Console.WriteLine("{1}:我从总部收到的消息:{0}",value.Text,this.Name);}publicvirtualvoidUnsubscribe(){unsubscriber.Dispose();}}publicclassProgram{publicstaticvoidMain(string[]args){Inspectorinspector1=newInspector("GregLestrade");检查员inspector2=newInspector("SherlockHolmes");总部headquarters=newHeadquarters();inspector1.订阅(总部);inspector2.订阅(总部);headquarters.SendMessage(newMessage("抓住莫里亚蒂!"));总部.EndTransmission();控制台.ReadKey();另一个建议——你可能想考虑对任何使用响应式扩展库nuget包的代码使用IObservable是Rx-Main,它的主页在这里:http://msdn.microsoft.com/en-us/data/gg577609.aspx这将为您节省大量样板代码。这是一个非常简单的例子:varhq=newSubject();varinspectorSubscription=hq.Subscribe(m=>Console.WriteLine("Inspectorreceived:"+m));varsubInspectorSubscription=hq.Subscribe(m=>Console.WriteLine("SubInspectorreceived:"+m));hq.OnNext("抓住莫里亚蒂!");它将输出:Inspectorreceived:CatchMoriarty!副督察收到:抓住莫里亚蒂!ReactiveExtensions是一个很大的Themes,也是一个非常强大的库——值得研究。我推荐上面链接中的动手实验。您可能希望将这些订阅嵌入Inspector、SubInspector实现中以更紧密地反映您的代码。但希望这能让您深入了解您可以使用Rx做什么。以上就是C#学习教程:C#中的IObserver和IObservable用于观察者和代理,事件分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。—本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
