分离事件

时间:2017-09-06 16:44:32

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

我在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;

2 个答案:

答案 0 :(得分:1)

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

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

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

这被发现为answer to a previous question。因此,我不能相信它。

答案 1 :(得分:0)

同意Max Pringle

如果您无法确定何时取消订阅代表,请考虑使用WeakEventManager