c# - 当不再引用订阅者时,如何实现取消订阅的事件?

标签 c# events messaging weak-references

我正在尝试实现一个消息传递系统,我只是使用常规的 .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/

相关文章:

引用其他类上的静态属性时的 c# 线程安全

c# - 使用 WMI 禁用帐户

c# - 在 C#/.NET 中避免 "program stopped working"

javascript - 在元素外部单击时切换元素并移除其可见性 - JavaScript

python - Slack app_home_opened 事件调用两次

java - JMS中是否可以由多个消费者从同一个队列消费?

c# - 如何将 xml 字符串读入 XMLTextReader 类型

javascript - 如何在元素上使用滚动条事件

rest - 是否有与 LINE 的 Messaging API 等效的 Kakao Talk Messaging API?

ruby-on-rails - rails : Moving logic out of Views