我正在尝试实现一个消息传递系统,我只是使用常规的 .NET 事件,但问题是发布者的生命周期比订阅者长,并且发布者持有对订阅者的引用并阻止事件被注销。
我一直在研究弱事件,但它们有太多不同的实现方式,我无法全神贯注于它们。我想要一些简单的东西。
此外,一旦事件没有引用,他们中的大多数不会立即注销该事件。我想要一个系统,一旦对象没有更多引用或超出范围,它会立即注销事件。
我可以不使用内置的事件语法糖,而是使用各种公共(public)静态类来促进整个工作。
我只希望能够在一个类中引发一个事件,该事件将调用所有订阅者的方法,这些订阅者将在订阅者不再使用后立即自动注销。
这可以完成吗?或者这是否已经以某种方式存在于框架中?
最佳答案
如果我们要定义一个委托(delegate):
public delegate void Callback (string s);
如果发布者类举办事件:
public event Callback Notify;
然后,订阅者构造函数将包含注册码, 它的类将包含一个订阅事件的“更新”方法:
class Subscriber
{
Publisher publisher;
public Subscriber (Publisher publisher)
{
this.publisher = publisher;
publisher.Notify += Update;
}
public void Update(string subjectState)
{
state = subjectState;
}
}
为了改变订阅者在事件即将结束时注销事件,我们需要为其类实现终结器:
~Subscriber ()
{
if (publisher != null)
{
publisher.Notify -= Update;
}
}
这样我们就可以确定订阅者将不再注册到事件中。 有关“Finalize”方法的更多信息,请阅读这篇精彩的 article from the 'MSDN' magazine on "Garbage Collection" .
关于c# - 当不再引用订阅者时,如何实现取消订阅的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13444435/