C# 这是内存泄漏吗?
我有一个如下所示的课程。服务器实例保存对侦听器实例的引用。侦听器通过事件委托保存对服务器实例的引用。这会阻止GC收集服务器实例吗?如果是这样,如何打破这个循环?我应该实现IDisposable、重写Finalize方法还是执行其他操作C# 这是内存泄漏吗?,c#,events,C#,Events,我有一个如下所示的课程。服务器实例保存对侦听器实例的引用。侦听器通过事件委托保存对服务器实例的引用。这会阻止GC收集服务器实例吗?如果是这样,如何打破这个循环?我应该实现IDisposable、重写Finalize方法还是执行其他操作 public class Server { public Listener Listener { get; private set; } public Server(Listener lis
public class Server
{
public Listener Listener { get; private set; }
public Server(Listener listener)
{
Listener = listener;
Listener.ClientChannelConnected += new EventHandler<ClientChannelConnectedArgs>(listener_ClientChannelConnected);
}
void listener_ClientChannelConnected(object sender, ClientChannelConnectedArgs e)
{
...
}
}
公共类服务器
{
公共侦听器{get;private set;}
公共服务器(侦听器)
{
监听器=监听器;
Listener.ClientChannelConnected+=新事件处理程序(Listener\u ClientChannelConnected);
}
无效侦听器\u ClientChannelConnected(对象发送方,ClientChannelConnectedArgs e)
{
...
}
}
不是。NET垃圾收集器足够聪明,可以解析循环引用。奇怪的是,我发现这种类型的代码一直在.NET中泄漏,因此必须小心-=事件处理程序。的确,记忆最终会被释放,但实际上,你希望自己尽快清理干净
此外,永远不要使用lambda表达式来处理事件,因为您将永远不会有对该对象的引用。Read。有时你应该使用-=。我不知道:(谢谢!如果其他对象仍有对保存委托列表的对象的引用,则会发生这种情况。在这种情况下,即使在您处理完服务器实例之后,侦听器仍在其他位置使用。这可能是您看到它们在内存中保留更长时间的原因。当您订阅事件的对象时,也可以使用Lambda。)n将在您希望事件被释放的同时被释放。当事件的生产者被释放时,它将丢失对其事件所持有的事件处理程序的引用,因此,这些对象可以依次被垃圾收集。