2012-02-06 10 views
7

वहाँ में सूचित किए जाने के किसी भी तरह से जब कुछ मेरी कक्षा में एक घटना का सदस्य बनता, या मैं तरीकों में सदस्यता/unsubsription लपेटो करने की आवश्यकता है है जैसे:किसी घटना/प्रतिनिधि के लिए सदस्यता लेने पर अधिसूचित होने का कोई तरीका?

public class MyClass : ISomeInterface 
{ 
    public event SomeEventHandler SomeEvent; //How do I know when something subscribes? 

    private void OnSomeEventSubscription(SomeEventHandler handler) 
    { 
      //do some work 
    } 

    private void OnSomeEventUnsubscription(SomeEventHandler handler) 
    { 
      //do some work 
    } 
} 
बजाय

public class MyClass : ISomeInterface 
{ 
    private SomeEventHandler _someEvent; 

    public void SubscribeToSomeEvent(SomeEventHandler handler) 
    { 
      _someEvent += handler; 

      //do some work 
    } 

    public void UnsubscribeFromSomeEvent(SomeEventHandler handler) 
    { 
      _someEvent -= handler; 

      //do some work 
    }  
} 

कारण मैं पूछता हूं क्योंकि यह घटना पहले से ही ISomeInterface पर उजागर हो चुकी है, लेकिन इस विशेष कार्यान्वयन को यह जानने की आवश्यकता है कि सामान सब्सक्राइब/सदस्यता समाप्त करते समय।

उत्तर

10

आप अपने ईवेंट के लिए कस्टम accessors लिख सकते हैं:

private SomeEventHandler _someEvent; 
public event SomeEventHandler SomeEvent 
{ 
    add 
    { 
     _someEvent += value; 
     Console.WriteLine("Someone subscribed to SomeEvent"); 
    } 
    remove 
    { 
     _someEvent -= value; 
     Console.WriteLine("Someone unsubscribed from SomeEvent"); 
    } 
} 
+1

ध्यान दें कि यह कोड घटना सदस्यता के साथ threadsafe नहीं है। इसे प्राप्त करने का एक आसान तरीका '_someEvent' को ईवेंट के रूप में भी चिह्नित कर रहा है। – CodesInChaos

+0

शानदार, धन्यवाद! – GazTheDestroyer

1

थॉमस पहले से ही इस जवाब दिया है, लेकिन सोचा कि मैं भी जोड़ना होगा कि आप ऐड में किसी भी महत्वपूर्ण अनुभाग वर्गों को हटाने के बाद से घटना सदस्यता है लॉक करने के लिए आवश्यकता हो सकती है कभी थ्रेड सुरक्षित नहीं है, यानी आपको पता नहीं है कि कौन आपके साथ कनेक्ट होगा या कब। उदा .:

private readonly object _objectLock = new object(); 
    private SomeEventHandler _someEvent; 

    public event SomeEventHandler SomeEvent 
    { 
     add 
     {  
      lock(_objectLock) 
      { 
       _someEvent += value; 
       // do critical processing here, e.g. increment count, etc could also use Interlocked class. 
      } // End if 
     } // End of class 
     remove 
     { 
      lock(_objectLock) 
      { 
       _someEvent -= value; 
       // do critical processing here, e.g. increment count, etc could also use Interlocked class. 
      } // End if 
     } // End if 
    } // End of event 
+0

आप '_someEvent' को शामिल करना भूल गए हैं। यदि यह सिर्फ एक फ़ील्ड है, तो आपका कोड धागा सुरक्षित नहीं है। – CodesInChaos

+0

हां आप सही हैं - सी # 4.0 आपको एक अंतर्निहित लॉक देता है यदि आप _someEvent को फ़ील्ड जैसी घटना के रूप में घोषित करते हैं, इसलिए यदि यह "निजी ईवेंट SomeEventHandler _someEvent" था, तो मूल्य जोड़ने/निकालने के लिए जोड़ें/निकालें के अंदर लॉक आवश्यक नहीं। – Jeb

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

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