winrt xaml - Throttling Events and Locking Methods -


चलो बहाना मुझे इस तरह से कुछ है:

  & lt; textbox text = "{बाध्यकारी पाठ, मोड = दोवे} "/ & gt;  

और ऐसा कुछ:

  सार्वजनिक वर्ग MyViewModel: INotifyPropertyChanged {सार्वजनिक MyViewModel () {// रन DoWork () जब यह.Text Observable बदलता है। एवेन्टपैटर्न & lt; प्रॉपर्टी चेंजडएवेंटएरग्स & gt; (यह, "प्रॉपर्टी चेंंकेड")। जहां (एक्स = & gt; x.EventArgs.PropertyName.Equals ("टेक्स्ट")) सदस्यता लें (async x = & gt; प्रतीक्षा करें DoWork ()); } निजी async टास्क डोकोव () {कार्य का इंतजार करना। डिले (यह। पाठ। लांघ * 100); } सार्वजनिक इवेंट PropertyChangedEventHandler PropertyChanged; निजी स्ट्रिंग _Text = "हैलो वर्ल्ड"; सार्वजनिक स्ट्रिंग पाठ {get {return _Text; } सेट {_Text = value; अगर (this.PropertyChanged! = Null) this.PropertyChanged (यह, नया PropertyChangedEventArgs ("Text")); }}}  

इस परिदृश्य में, उपयोगकर्ता बहुत तेज़ी से टाइप कर सकता है मुझे जरूरत है:

    DoWork () जबकि DoWork () पहले से ही चल रहा है नहीं चलना चाहिए

  1. उपयोगकर्ता spurts में टाइप कर सकते हैं,

  2. DoWork () अंतिम परिवर्तन तक इंतजार नहीं कर सकता है, यदि उछाल है> 1 सेकंड

  3. DoWork () को सिस्टम बेकार होने पर कॉल नहीं किया जाना चाहिए

  4. DoWork की अवधि () इस की लंबाई के आधार पर भिन्न होती है। पाठ

सवाल ऐसा नहीं है कि आरएक्स ऐसा कर सकता है। मुझे पता है यह कर सकते हैं सही वाक्यविन्यास क्या है?

जब मैं जेम्स वर्ल्ड से सहमत हूँ, मुझे लगता है कि आप बेहतर कर सकते हैं, अगर हम सिर्फ अस्थिर राज्य का थोड़ा सा उपयोग करते हैं क्या होगा अगर DoWork इस तरह देखा:

  asyncSubject & lt; इकाई & gt; काम कर रहा हूं; सार्वजनिक IObservable & lt; इकाई & gt; DoWork () {if (doingWork! = Null) वापस कर रहा है वर्क; DoingWork = Observable.Start ((=) = & gt; {XXX: काम थ्रेड। नींद (1000); // हम केवल 1sec टाइमआउट बंद कर देते हैं * हम काम करने के बाद * Observable.Timer (TimeSpan.FromSeconds (1.0 ), DispatcherScheduler.Instance)। सदस्यता लें (_ = & gt; करशब्द = शून्य);}); वापसी कर रहा है वर्क; }  

अब, DoWork स्वतः debounces Automagically ™, और हम इस से छुटकारा पा सकते हैं इंतजार में silliness; हमने क्विक-टू-टू-टू-क्विक होने के लिए थ्रॉटल को 250ms तक सेट किया है।

यह शुरू में उपरोक्त आवश्यकता # 5 का उल्लंघन कर रहा है, लेकिन हम यह सुनिश्चित किया है कि किसी को भी बहुत जल्दी DoWork बुला सिर्फ पिछले रन के परिणाम प्राप्त होता है - क्या प्रभाव पड़ेगा कि DoWork कई बार बुलाया जाएगा, लेकिन जरूरी नहीं कि करना कुछ भी यह हालांकि सुनिश्चित करता है, कि अगर हम काम नहीं कर रहे हैं, हम उपयोगकर्ता के टाइपिंग बंद के बाद थ्रॉटल (1.seconds) चाहेंगे

 <, एक 1sec देर नहीं लगेगी कोड> Observable.FromEventPattern & LT; PropertyChangedEventArgs & gt; (यह, "PropertyChanged") .Where (एक्स = & gt; x.EventArgs.PropertyName.Equals ( "पाठ")) .Throttle (TimeSpan.FromMilliseconds (250), DispatcherScheduler.Instance)। SelectMany (_ = & gt; DoWork ()) .Catch & LT; यूनिट, अपवाद & gt; (पूर्व = & gt; {Console.WriteLine ( "ओह बकवास, DoWork विफल रहा है: {0}", पूर्व); लौट Observable.Empty & LT; यूनिट & gt; ( );}) .Subscribe (_ = & gt; Console.WriteLine ( "काम किया"));  

Comments