按事件通知实例

时间:2012-09-04 16:42:03

标签: c# events

我认为我想要做的事情非常简单,但我无法设法

我在A类的某个地方有一个静态事件:

public static event Action OnInvalidated;

我的数据无效时调用。 当我实例化一个新的B类时,我想做以下几点:

A.OnInvalidated+= () => this.RefreshColumns();

基本上我想在OnInvalidated触发时注册的每个实例上调用RefreshColumns。

这个编译很好,但是当我处理我的对象时如何删除lambda函数? 我认为这样做

 A.OnInvalidated-= () => this.RefreshColumns();

无效,我无法宣布

Action myAction = () => this.RefreshColumns();

作为功能成员

2 个答案:

答案 0 :(得分:2)

尝试如下:

class A : IDisposable
{
    public static event Action OnInvalidated;

    public A()
    {
        A.OnInvalidated +=  this.SomeMethod();
        A.OnInvalidated +=  this.SomeOtherMethod();
    }

        public void Dispose()
        {
        A.OnInvalidated -=  this.SomeMethod();
        A.OnInvalidated -=  this.SomeOtherMethod();
        }

    public SomeMethod()
    {

    }

    public SomeOtherMethod()
    {

    }
}

请注意,如果要避免内存泄漏,请务必在Dispose()中实现IDisposable并取消订阅所有静态事件。否则静态事件的订阅者将永远不会被垃圾收集,因为事件维护对对象的引用。

答案 1 :(得分:1)

首先,而不是:

A.OnInvalidated+= () => this.RefreshColumns();

直接分配方法(注意缺少()以及lambda声明):

A.OnInvalidated += this.RefreshColumns;

然后当您取消订阅时,只需:

A.OnInvalidated -= this.RefreshColumns;

我认为问题在于你在不需要时引入这个匿名lambda,这使得取消订阅该方法变得更加困难。