2012-01-24 15 views
6

मैं .net Observable कक्षा का उपयोग कर एक साधारण पर्यवेक्षक पैटर्न को लागू करने की कोशिश कर रहा हूं। मैं कोड है कि इस तरह दिखता है:.net अवलोकन 'ObserveOn' एक पृष्ठभूमि धागा

Observable.FromEventPattern<PropertyChangedEventArgs>(
    Instance.User, 
    "PropertyChanged") 
      .Where(e => e.EventArgs.PropertyName == "FirstName") 
      .ObserveOn(Scheduler.ThreadPool) 
      .Subscribe(search => OnFirstNameChanged(search.EventArgs)); 

Observable.FromEventPattern<PropertyChangedEventArgs>(
    Instance.User, 
    "PropertyChanged") 
      .Where(e => e.EventArgs.PropertyName == "LastName") 
      .ObserveOn(Scheduler.ThreadPool) 
      .Subscribe(search => OnLastNameChanged(search.EventArgs)); 

मैं पर्यवेक्षकों एक पृष्ठभूमि धागा पर चलाना चाहते हैं, लेकिन मैं उन्हें एक ही पृष्ठभूमि धागे पर सभी चलाना चाहते हैं (हमारी वास्तविक कार्यान्वयन के लिए, यह भी करने के लिए जटिल हो जाएगा प्रत्येक श्रोता को एक अलग थ्रेड पर रखें)।

अर्थात मैं OnXXXChanged तर्क के सभी यूआई धागा के अलावा किसी अन्य धागे पर प्रदर्शन किया जा सकता है, लेकिन Observing पूरे ThreadPool पर करने के बजाय, मुझे यकीन है कि वे सही क्रम में चलाने के लिए, एक ही धागे पर बनाना चाहते चाहते हैं।

उपरोक्त को कैसे संशोधित किया जाना चाहिए?

इसके अलावा, कुछ हद तक संबंधित नोट पर, क्या इस पैटर्न को लागू करने के लिए Observable कक्षा का उपयोग करके कोई अच्छा नमूना कोड उदाहरण हैं?

उत्तर

13

आप एक EventLoopScheduler बना सकते हैं और ObserverOn के लिए सभी कॉल में है कि एक उदाहरण का उपयोग करना चाहिए:

var scheduler = new EventLoopScheduler(ts => new Thread(ts)); 

... .ObserveOn(scheduler). ... 

धागा कारखाने विधि द्वारा बनाई गई पर निष्पादन शेड्यूल करने के लिए इस्तेमाल किया धागा है। संपत्ति छोड़कर ExitIfEmptyfalse पर सेट करें यह थ्रेड समाप्त नहीं होगा, भले ही इसका अर्थ यह न हो कि प्रत्येक कॉल के लिए इसका पुन: उपयोग किया जाएगा।

हालांकि, आप Scheduler.NewThread का उपयोग करने पर भी विचार कर सकते हैं। उस शेड्यूलर का उपयोग करने से थ्रेड को समाप्त करने की अनुमति मिलेगी यदि ऐसा करने के लिए और कुछ नहीं है। जब ObserverOn द्वारा अधिक काम कतारबद्ध किया जाता है तो एक नया धागा बनाया जाएगा, लेकिन केवल एक ही धागा मौजूद होना चाहिए जिसका अर्थ है कि आपने अलग-अलग पर्यवेक्षकों को सिंक्रनाइज़ नहीं किया है।

EventLoopScheduler (जिसे Scheduler.NewThread द्वारा उपयोग किया जाता है) द्वारा निर्मित धागे Event Loop # नामित हैं। आप इन नामों को डीबगर में देखेंगे।

+0

ग्रेट, बहुत बहुत धन्यवाद! – user981225

+1

EventLoopScheduler IDISposable लागू करता है ताकि आप इसका निपटान करने के लिए जिम्मेदार होंगे। आप सब्सक्रिप्शन में जीवन भरने के लिए उपयोग करने योग्य फैक्ट्री विधि का उपयोग कर सकते हैं। – Fredrick

+0

शेड्यूलर.NewThread अभी बहिष्कृत है, आपको इसके बजाय NewThreadScheduler.Default का उपयोग करना चाहिए। – Kreshnik

5

.ObserveOn(Scheduler.ThreadPool) एक थ्रेड शेड्यूलर लेता है जो अवलोकन चलने वाले थ्रेड को निर्देशित करता है। ऐसा लगता है कि आप थ्रेडपूल के बजाय EventLoopScheduler का उपयोग करना चाहते हैं।

+0

बहुत बहुत धन्यवाद! – user981225

+0

शेड्यूलर। थ्रेडपूल अप्रचलित बना दिया गया – liang

संबंधित मुद्दे