c# - 事件处理程序会阻止垃圾收集的发生吗?

标签 c# .net event-handling garbage-collection

如果我有以下代码:

MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass = null;

pClass 会被垃圾回收吗?或者它会在事件发生时仍然触发它的事件吗?我是否需要执行以下操作才能进行垃圾回收?

MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass.MyEvent -= MyFunction;
pClass = null;

最佳答案

对于“pClass是否会被垃圾回收”这个具体问题:事件订阅对pClass的回收没有影响(作为发布者)。

对于一般的 GC(特别是目标):这取决于 MyFunction 是静态的还是基于实例的。

实例方法的委托(delegate)(例如事件订阅)包括对该实例的引用。所以是的,事件订阅将阻止 GC。然而,一旦发布事件的对象(上面的 pClass)符合收集条件,这就不再是问题了。

注意这是单向的;即如果我们有:

publisher.SomeEvent += target.SomeHandler;

然后“publisher”将使“target”保持事件状态,但“target”不会使“publisher”保持事件状态。

所以不:如果无论如何都要收集 pClass,则无需取消订阅监听器。但是,如果 pClass 是长期存在的(比具有 MyFunction 的实例长),则 pClass 可以使该实例保持事件状态,因此如果您希望收集目标,则有必要取消订阅。

但是,由于这个原因,静态事件在与基于实例的处理程序一起使用时非常危险。

关于c# - 事件处理程序会阻止垃圾收集的发生吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/298261/

相关文章:

c# - conditional-middleware-in-aspnet-core 在 asp.net core 1.1 中不工作

c# - 如何在 MongoDB C# Driver 2.0 中记录我的查询?

.net - Swagger 的划掉方法

.net - 如何使用 ConnectionMultiplexer 在 Redis 集群中处理故障转移?

swift - 如何检测 SwiftUI 中的右键单击?

c# - 将 C# 对象转换为 JSON 或 Javascript 对象

C#通过windows api从文件中获取缩略图

Firefox 中的 Java 小程序

ios - GA 事件跟踪中的动态标签名称?

java - 如何正确调试Spring Events?