2011-11-21 15 views
5

मुझे लगता है कि सी # Evenhandler श्रोताओं की एक सूची है और यह संदेश भेजते समय सूची के माध्यम से loops। मेरा सवाल यह है कि यह आंतरिक रूप से कैसे काम करता है। क्या यह सूची के माध्यम से इसे लूप करने से पहले सूची की प्रति बना देता है और यदि ऐसा है, तो क्या होता है यदि कोई सूची सूची के बाद स्वयं को अनधिकृत कर लेता है लेकिन इसे अभी तक संदेश प्राप्त नहीं हुआ है।सी # इवेंटहालर आंतरिक रूप से कैसे काम करता है?

क्या यह अभी भी संदेश प्राप्त करेगा, क्या यह स्वयं भी पंजीकरण रद्द कर चुका है?

उत्तर

6

एक प्रतिनिधि अपरिवर्तनीय है, इसलिए जब आप एक प्रतिनिधि का आह्वान कर रहे हैं तो ग्राहकों की सूची ज्ञात और तय की जाती है। सदस्यता लेना या सदस्यता रद्द करना उस प्रतिनिधि को प्रतिस्थापित करता है जो ईवेंट को कम करता है।

यह वास्तव में क्या मतलब है कि एक मल्टी-थ्रेडेड परिदृश्य में आप, सदस्यता त्यागने की प्रक्रिया के बाद एक घटना प्राप्त कर सकते हैं क्योंकि या तो:

  1. प्रतिनिधि लागू किया जा रहा
  2. का एक स्नैपशॉट की प्रक्रिया में पहले से ही था प्रतिनिधि पहले से ही

लागू 2 से की उद्देश्य के लिए प्राप्त किया गया था, मैं हमेशा की तरह पैटर्न मतलब (एक अशक्त-रेफरी duri को रोकने के लिए एनजी आह्वान):

var handler = SomeEvent; 
// <===== another thread could unsubscribe at this point 
if(handler != null) handler(sender, args); // <== or part way through this invoke 
// (and it either case, have the event trigger even though they think they have 
// unsubscribed) 

कारण है कि, आप की घटनाओं के साथ जटिल मल्टी-थ्रेडेड कोड कोडिंग कर रहे हैं, तो आपको कोड चाहिए रक्षा ऐसी है कि घटना के बादफायरिंग आपको लगता है कि आप बंद कर दिया है एक समस्या नहीं है।

ये बारीकियों वास्तव में सिंगल-थ्रेडेड कोड को प्रभावित नहीं करते हैं।

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