如何在不再引用订户时实现取消订阅的事件?

时间:2012-11-18 20:51:23

标签: c# events messaging weak-references

我正在尝试实现一个消息传递系统而我只是使用常规的.NET事件,但问题是发布者的寿命比订阅者长,并且发布者持有对订阅者的引用并阻止该事件被取消注册。

我正在研究弱事件,但是它们有很多不同的实现方式,我在绕着它们缠绕我的大脑时遇到了麻烦。我想要一些简单的东西。

此外,一旦它没有引用,大多数都不会立即取消注册该事件。我想要一个系统,一旦对象没有更多的引用或超出范围,就会立即取消注册该事件。

我没有使用内置的事件语法糖,而是使用公共静态类来促进整个努力。

我希望能够在一个类中引发一个事件,该事件将调用所有订阅的方法,这些方法将在订阅者不再使用后立即自动取消注册。

可以这样做还是已经以某种方式存在于框架中?

1 个答案:

答案 0 :(得分:0)

如果我们要定义一个委托:

public delegate void Callback (string s);

如果发布者类持有一个事件:

public event Callback Notify;

然后,订阅者构造函数将包含注册码, 它的类将包含一个订阅事件的“Update”方法:

   class Subscriber 
 {
     Publisher publisher;

     public Subscriber (Publisher publisher) 
     {
      this.publisher = publisher;
      publisher.Notify += Update;
     }

    public void Update(string subjectState) 
    {
     state = subjectState;
    }
 }

为了将此订阅者更改为从事件发生时取消注册,我们需要为其类实现Finalizer:

~Subscriber () 
 {
   if (publisher != null)
   {
     publisher.Notify -= Update;
   }
 }

这样我们就可以确定订户将不再注册该活动。 有关“Finalize”方法的更多信息,请阅读这篇精彩的article from the 'MSDN' magazine on "Garbage Collection"