2010-08-30 9 views
5

मेरी कोड में एक बिंदु पर, मैं the following event की सदस्यता: -मैं कैसे जांच सकता हूं कि .NET में किसी ईवेंट की सदस्यता ली गई है या नहीं?

UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 

अच्छा काम करता है और जब संदेश कतार के प्राप्त घटना आग पूरे, मेरे प्रतिनिधि यह संभालती है।

अब, मैं यह देखने के लिए जांच कर रहा हूं कि घटना की सदस्यता लेने से पहले, इस पर सदस्यता लेने से पहले। मैं एक संकलन समय त्रुटि मिलती है जब मैं करता हूँ: -

// Compile Time Errors... 
if (UploadFolderMessageQueue.ReceiveCompleted == null) 
    { 
     UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 
     UploadFolderMessageQueue.Formatter = 
      new XmlMessageFormatter(new[] {typeof (string)}); 
    } 

घटना 'System.Messaging.MessageQueue.ReceiveCompleted' केवल बाएं हाथ की ओर + = या के पर प्रकट कर सकते हैं - =

मैं जानता हूँ कि यह शर्मनाक सरल है .. लेकिन मैं स्टम्प्ड हूँ :(कोई सुझाव?

+0

आपको अपना कोड डिज़ाइन करने का प्रयास करना चाहिए ताकि आप अनुमानित तरीके से सदस्यता ले रहे हों और सदस्यता रद्द कर सकें। –

उत्तर

13

आप इस घटना के लिए ग्राहक से ऐसा नहीं कर सकते। केवल प्रकाशक जाँच कर सकते हैं अगर कोई ग्राहक हैं। यो यू की तरह अपनी कक्षा में कुछ अन्य प्रणाली का उपयोग करके सदस्यता का ट्रैक रखने की आवश्यकता होगी:

कि वाणी
if(handlerAttached) 
{ 
    //DO YOUR STUFF 
} 
0

अशक्त परीक्षण केवल वर्ग के भीतर किया जा सकता है:

UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 
bool handlerAttached=true; 

तो आप इस का उपयोग कर सकते घटना (यानी UploadFolderMessageQueue प्रकार।)

1) यदि आपके पास इस कक्षा के स्रोत तक पहुंच है तो आप एक विधि या संपत्ति जोड़ सकते हैं जो परीक्षण करता है और एक बूलियन परिणाम देता है जिसे आप सब्सक्राइब करने से पहले जांच सकते हैं।

2) यदि आप घोषणा कक्षा को संशोधित नहीं कर सकते हैं, और आप केवल अपने कोड से पुन: सदस्यता की जांच कर रहे हैं, तो आप एक बुलियन चर में सदस्यता को अलग से रिकॉर्ड कर सकते हैं, और उसके बाद (पुनः) सदस्यता लें।

3) यदि आप घोषणा कक्षा को नहीं बदल सकते हैं और आप अपने आप के अलावा अन्य कोड से सदस्यता की जांच कर रहे हैं, तो कोई समाधान नहीं दिखता है।

14

आप यकीन है कि वहाँ केवल एक ही ग्राहक आप निम्नलिखित कोड का उपयोग कर सकते है कि बनाने के लिए की जरूरत है: अन्य मामले में तो UploadFolderMessageQueue.ReceiveCompletednull है तो पहली पंक्ति कोई कार्य नहीं करेगा

UploadFolderMessageQueue.ReceiveCompleted -= UploadMSMQReceiveCompleted; 
UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 

, ईवेंट हैंडलर हो जाएगा हटा दिया। इसका मतलब है कि UploadFolderMessageQueue.ReceiveCompleted में हमेशा एक ही ग्राहक होगा (बेशक अगर UploadMSMQReceiveCompleted उस ईवेंट के लिए एकमात्र एक ईवेंट हैंडलर है)।

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

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