2009-06-01 23 views
7

मेरी कक्षा के प्रसारण एक घटना है जो बाहरी वस्तुओं सदस्यता ले जाएगा करने के लिए है।अग्रेषण/नेट घटनाओं

private class Listener 
{ 
    public void Run() 
    { 
     // events raised here which should be forwarded 
     // to parent's MessageReceived 
    } 
}; 

मेरे झुकाव श्रोता पर समान हस्ताक्षर से एक ईवेंट बनाते हैं, और आदेश MessageReceived पर बढ़ाने के लिए मुख्य वर्ग में सदस्यता ले रहा है। यह थोड़ा बोझिल लगता है, इसलिए मैं सोच रहा था कि इस तरह की घटनाओं को अग्रेषित करने का एक साफ/मूर्ख तरीका है या नहीं।

उत्तर

22

आप घटना add/remove accessors उपयोग कर सकते हैं ताकि बाहरी का सामना घटना के लिए तार की घटनाओं आंतरिक श्रोता

public event EventHandler<MessageReceivedEventArgs> MessageReceived { 
    add { this.listener.MessageRecieved += value; } 
    remove { this.listener.MessageRecieved -= value; } 
} 

इसका मतलब है आप श्रोता में ईवेंट बनाने की जरूरत करने के लिए "अग्रेषित" हैं, लेकिन लाभ यह है घटना को तार करने के लिए कोई अन्य नलसाजी नहीं है।

+8

यह एक अच्छा समाधान है, लेकिन ध्यान रखें कि ईवेंट हैंडलर इस तर्क है, जो एक समस्या हो सकती है के रूप में श्रोता उदाहरण प्राप्त होगा ... –

+0

अच्छा, मुझे यह पसंद है! – marijne

+1

प्रेषक के बारे में भी एक अच्छा बिंदु ... – marijne

1

आप किसी ईवेंट के साथ ऐसा कर सकते हैं, या आप अपने मुख्य वर्ग में ReceiveMessage() नामक एक विधि बना सकते हैं और श्रोता से कॉल कर सकते हैं (और उसके बाद ईवेंट को बढ़ाएं)।

1

जैसा कि इसका उत्तर दिया गया है, आप अपने ईवेंट पर हैंडलर जोड़ने और निकालने का उपयोग कर एक कस्टम सदस्यता ले सकते हैं।

ध्यान दें कि इस डिज़ाइन में कोई समस्या है। आप निर्दिष्ट करते हैं कि आपका श्रोता इस कार्यक्रम को अपने धागे में उठा रहा है। डिफ़ॉल्ट रूप से, हैंडलर को थ्रेड पर बुलाया जाएगा जो घटना को उठाएगा (आपके मामले में, श्रोता के धागे में)। आपके पास कई विकल्प हैं।

  • यदि आपको श्रोता के थ्रेड को कॉलबैक निष्पादित करने की परवाह नहीं है। बस घटना कहते हैं के रूप में (लेकिन अपने श्रोता धागा अवरुद्ध किया जा सकता एक eventhandler निष्पादित करने के लिए कुछ समय लगता है अगर, या सिर्फ एक ईवेंट हैंडलर एक बिना क्रिया का अपवाद फेंकता है तो मर जाते हैं)
  • आप धागे श्रोता के तुलना में अलग में चलाने के संचालकों चाहते हैं थ्रेड, लेकिन जब तक श्रोता में नहीं है, तब तक थ्रेड्स पर ध्यान न दें: ऑनऑक्स विधि में जो वास्तव में हैंडलर को कॉल करता है, ईवेंट की आमंत्रण सूची प्राप्त करें और प्रत्येक हैंडलर को थ्रेडपूल में कतार दें।
  • को हैंडलर विशिष्ट धागे में कहा जा करना चाहते हैं: थोड़ी सूझबूझ से काम आप

एक ब्लॉग पोस्ट नहीं है कुछ SynchronizationContext (Winforms में WindowsSynchronizationContext, एक कस्टम अन्य मामलों में एक, आदि) का उपयोग करना होगा, रॉय ओशरोव द्वारा एसिंक कॉल करने के कई तरीके दिखाए जा रहे हैं: http://weblogs.asp.net/rosherove/pages/DefensiveEventPublishing.aspx (लेकिन मैं प्रतिनिधियों पर एसिंक कॉल का उपयोग नहीं करता और इसके बजाय प्रतिनिधियों को कॉल करने के लिए सीधे थ्रेडपूल पर भरोसा करता हूं)।

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