我在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;
答案 0 :(得分:1)
在订阅事件处理程序时,事件的发布者通过事件处理程序委托保存对订阅者的引用(假设委托是实例方法)。
如果发布者比订阅者的寿命更长,那么即使没有其他对订阅者的引用,它也会使订阅者保持活跃状态。
如果您使用相同的处理程序取消订阅事件,那么是,这将删除处理程序和可能的泄漏。
这被发现为answer to a previous question。因此,我不能相信它。
答案 1 :(得分:0)
同意Max Pringle
如果您无法确定何时取消订阅代表,请考虑使用WeakEventManager。