我正在尝试实现一个消息传递系统而我只是使用常规的.NET事件,但问题是发布者的寿命比订阅者长,并且发布者持有对订阅者的引用并阻止该事件被取消注册。
我正在研究弱事件,但是它们有很多不同的实现方式,我在绕着它们缠绕我的大脑时遇到了麻烦。我想要一些简单的东西。
此外,一旦它没有引用,大多数都不会立即取消注册该事件。我想要一个系统,一旦对象没有更多的引用或超出范围,就会立即取消注册该事件。
我没有使用内置的事件语法糖,而是使用公共静态类来促进整个努力。
我希望能够在一个类中引发一个事件,该事件将调用所有订阅的方法,这些方法将在订阅者不再使用后立即自动取消注册。
可以这样做还是已经以某种方式存在于框架中?
答案 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"。