有什么方法可以在订阅事件/代理时得到通知?
有当一些订阅的事件在我的课,或者我需要换行认购/ 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");
}
}
托马斯已经回答了这一点,但想到我也想补充一点,你可能需要锁定在添加任何关键部分去掉的部分,因为事件订阅从来没有线程安全,即你不知道谁将连接到你或什么时候。例如:
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
你忘记了包含'_someEvent'。如果它只是一个字段,你的代码也不是线程安全的。 – CodesInChaos 2012-02-06 11:51:52
是的你是对的 - 如果你将_someEvent声明为一个类字段事件,那么C#4.0会给你一个隐式锁定,所以如果它是“private event SomeEventHandler _someEvent”,那么锁定里面的add/remove用于添加/删除值不需要。 – Jeb 2012-02-07 10:02:31
请注意,使用此代码事件订阅不是线程安全的。实现这一点的简单方法是将_someEvent标记为事件。 – CodesInChaos 2012-02-06 10:41:00
辉煌,谢谢! – GazTheDestroyer 2012-02-06 10:45:16