当前位置: 首页 > 编程语言 > C#

订阅后添加可观察序列Share

时间:2023-04-10 18:48:32 C#

订阅后添加可观察序列我们使用Rx来监视Silverlight应用程序中的活动,以便我们可以在一段时间不活动后向用户显示消息。我们将事件(mousemove等)转换为observable,然后将这些observable合并在一起以创建单个(allActivity)observable。然后,我们使用时间跨度限制allActivity可观察对象,并在系统处于非活动状态一段时间后订阅某些通知。我如何在订阅后为此添加一个新的可观察/序列(这样订阅就可以在不取消订阅和重新订阅的情况下获取它)。例如,将几个序列合并在一起,节流,订阅。现在向订阅的可观察对象添加一个额外的序列。示例代码:privateIObservableallActivity;publicvoidCreateActivityObservables(UIElementuiElement){//创建我们感兴趣的事件类型的IObservables并将它们投射为DateTimes//这些是我们的observables序列,可以将数据推送给订阅者/观察者//注意:这些在某种意义上就像IQueryables他们不迭代序列只是提供一个IObservable类型varmouseMoveActivity=Observable.FromEventPattern(h=>uiElement.MouseMove+=h,h=>uiElement.MouseMove-=h).Select(o=>DateTime.Now);varmouseLeftButtonActivity=Observable.FromEventPattern(h=>uiElement.MouseLeftButtonDown+=h,h=>uiElement.MouseLeftButtonDown-=h).Select(o=>DateTime.Now);varmouseRightButtonActivity=Observable.FromEventPattern(h=>uiElement.MouseRightButtonDown+=h,h=>uiElement.MouseRightButtonDown-=h).Select(o=>DateTime.Now);varmouseWheelActivity=Observable.FromEventPattern(h=>uiElement.MouseWheel+=h,h=>uiElement.MouseWheel-=h).Select(o=>DateTime.Now);varkeyboardActivity=Observable.FromEventPattern(h=>uiElement.KeyDown+=h,h=>uiElement.KeyDown-=h).Select(o=>DateTime.Now);varstreetViewContainer=HtmlPage.Document.GetElementById("streetViewContainer");varmouseMoveHandler=newEventHandler(this.Moo);boolb=streetViewContainer.AttachEvent("mousemove",mouseMoveHandler);varbrowserActivity=Observable.FromEventPattern(h=>this.MyMouseMove+=h,h=>this.MyMouseMove-=h).Select(o=>DateTime.Now);//将IObservables合并到一个流/序列中}publicIDisposableSubscribe(TimeSpantimeSpan,ActiontimeoutAction){IObservabletimeoutNotification=this.allActivity.Merge(IdleTimeoutService.GetDateTimeNowObservable()).Throttle(timeSpan).ObserveOn(Scheduler.ThreadPool);返回timeoutNotification.Subscribe(timeoutAction);最简单的方法是使用中间主题而不是Merge调用SubjectallActivities=newSubject();varactivitySubscriptions=newCompositeDisposable();activitySubscriptions.Add(mouseMoveActivity.Subscribe(allActivities));activitySubscriptions.Add(mouseLeftButtonActivity.Subscribe(allActivities));//等等...//订阅活动allActivities.Throttle(timescSpan)。(超时动作);//稍后添加另一个activitySubscriptions.Add(newActivity.Subscribe(allActivities));如果收到任何OnError或OnCompleted,Subject类将停止从任何订阅事件的可观察对象传递OnNext(以及进一步的OnError和OnCompleted)。这种方法与您的示例之间的主要区别在于它在创建主题时订阅所有事件,而不是在订阅合并的可观察对象时订阅。由于您示例中的所有可观察对象都是热的,因此差异应该不会太明显。Merge有一个重载,需要一个IObservable>。使外部序列成为Subject>并在您想要将另一个源添加到组时调用OnNext。Merge算子会收到source并订阅:以上是C#学习教程:订阅后添加observable序列共享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——varxss=newSubject>();xss.Merge().Subscribe(x=>Console.WriteLine(x));xss.OnNext(Observable.Interval(TimeSpan.FromSeconds(1.0)).Select(x=>23+8*(int)x));xss.OnNext(Observable.Interval(TimeSpan.FromSeconds(0.8)).Select(x=>17+3*(int)x));xss.OnNext(Observable.Interval(TimeSpan.FromSeconds(1.3)).Select(x=>31+2*(int)x));...本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: