【问题标题】:Detaching the events分离事件
【发布时间】:2017-09-06 16:44:31
【问题描述】:

我在我的 WPF 应用程序中跟踪 C# 代码,并且对分离事件有疑问。

public class Publisher
{
    public event EventHandler Completed;
    public void Process()
    {
        // do something
        if (Completed != null)
        {
            Completed(this, EventArgs.Empty);
        }
    }
}

public class Subscriber
{
    public void Handler(object sender, EventArgs args) { }
}

用法:

Publisher pub = new Publisher();
Subscriber sub = new Subscriber();
pub.Completed += sub.Handler;
// this will invoke the event
pub.Process();

我的问题是,如果我不取消订阅处理程序方法并使用以下代码行将对象设置为 null,会导致应用程序中的任何内存泄漏吗?

pub.Completed -= sub.Handler
pub=null;sub=null;

【问题讨论】:

  • 不,不在那个 sn-p 中。 Publisher 对象仅由包含代码的方法的局部变量引用。因此,一旦 pub.Publish() 运行完成,两个对象就可以同时被垃圾收集。发布者的订阅者寿命更长,这是一个更麻烦的场景。

标签: c# performance memory-leaks event-handling


【解决方案1】:

在订阅事件处理程序时,事件的发布者通过事件处理程序委托持有对订阅者的引用(假设委托是实例方法)。

如果发布者的寿命比订阅者长,那么即使没有其他对订阅者的引用,它也会让订阅者保持活动状态。

如果您使用相等的处理程序取消订阅事件,那么是的,这将删除处理程序和可能的泄漏。

这是一个answer to a previous question。所以我不能把它归功于它。

【讨论】:

    【解决方案2】:

    同意 Max Pringle

    如果您无法确定何时应退订委托,请考虑使用WeakEventManager

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2012-03-24
      • 1970-01-01
      相关资源
      最近更新 更多