एक नमूदार स्रोत को देखते हुए मतदान हुए निम्न-स्तर डिवाइस के राज्य (एक के परिवर्तन) द्वारा उत्पन्न को बाधित किए बिना समय समाप्ति पर एक कार्रवाई को अंजाम ...आरएक्स फ्रेमवर्क: मूल नमूदार अनुक्रम
// observable source metacode:
IObservable<DeviceState> source = Observable.Interval(TimeSpan.FromSeconds(0.5))
.Select(tick => new DeviceState(_device.ReadValue()))
.DistinctUntilChanged();
.. । और एक उपभोक्ता है कि यूआई अद्यतन करता है ...
// UI metacode:
service.GetObservableDeviceStates()
.Subscribe(state => viewModel.CurrentState = state.ToString());
... मैं स्रोत के लिए सदस्यता को बाधित किए बिना, स्रोत की 'निष्क्रियता' के एक्स सेकंड के बाद एक कस्टम क्रिया को निष्पादित करने की जरूरत है। कुछ ऐसा:
// UI metacode:
service.GetObservableDeviceStates()
.DoOnTimeout(TimeSpan.FromSeconds(x),() => viewModel.CurrentState = "Idle")
.Subscribe(state => viewModel.CurrentState = state.ToString());
सर्वोत्तम प्रथाओं क्या हैं? संभावित समाधान जो मन में आ रहे हैं (मैं एक आरएक्स noob हूँ):
- Buffer (भले ही वह इतना पठनीय नहीं है)
- आसपास this Timeout overload बजाना;
कुछ खास "सेवा-साइड" जब कुछ भी नहीं (DistinctUntilChanged उपयोग करने के बजाय) बदल जाता रिटर्निंग और यूआई कोड पर यह के साथ काम:
service.GetObservableDeviceStates() .Subscribe (राज्य => viewModel.CurrentState = राज्य। विशेष? "निष्क्रिय": राज्य.ToString());
संपादित करें: के रूप में in the answer सूचना दी, समाधान है:
service.GetObservableDeviceStates()
.Do(onNext)
.Throttle(TimeSpan.FromSeconds(x))
.Subscribe(onTimeout);
EDIT2 (चेतावनी)
तो onNext और onTimeout अद्यतन UI घटक, CrossThreadExceptions से बचने के लिए दो ObserveOn (uiSynchronizationContext) जरूरी है, क्योंकि थ्रॉटल एक और थ्रेड पर काम करता है!
service.GetObservableDeviceStates()
.ObserveOn(uiSynchronizationContext)
.Do(onNext)
.Throttle(TimeSpan.FromSeconds(x))
.ObserveOn(uiSynchronizationContext)
.Subscribe(onTimeout);
आपको वहाँ थ्रॉटलिंग टाइमर चलाने के लिए रुके एक पैरामीटर के रूप यूआई धागा अनुसूचक निर्दिष्ट कर सकते हैं, में इसका मतलब है यदि आप अतिरिक्त ObserveOn हॉप से बचना चाहते हैं। –
@ बार्टडेसमेट मैंने पहले ही थ्रॉटल (एक्स, शेड्यूलर.कुरेंट थ्रेड) की कोशिश की है, लेकिन मैं यूआई प्रतिक्रिया खो रहा था ... मेरे मामले में, ObserveOn बेहतर काम किया – Notoriousxl