有什么方法可以在订阅事件/代理时得到通知?

有什么方法可以在订阅事件/代理时得到通知?

问题描述:

有当一些订阅的事件在我的课,或者我需要换行认购/ 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上,但是这个特定的实现需要知道什么时候订阅/取消订阅。

您可以编写自定义访问器为您的活动:

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

请注意,使用此代码事件订阅不是线程安全的。实现这一点的简单方法是将_someEvent标记为事件。 – CodesInChaos 2012-02-06 10:41:00

+0

辉煌,谢谢! – GazTheDestroyer 2012-02-06 10:45:16

托马斯已经回答了这一点,但想到我也想补充一点,你可能需要锁定在添加任何关键部分去掉的部分,因为事件订阅从来没有线程安全,即你不知道谁将连接到你或什么时候。例如:

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 2012-02-06 11:51:52

+0

是的你是对的 - 如果你将_someEvent声明为一个类字段事件,那么C#4.0会给你一个隐式锁定,所以如果它是“private event SomeEventHandler _someEvent”,那么锁定里面的add/remove用于添加/删除值不需要。 – Jeb 2012-02-07 10:02:31