【发布时间】:2012-06-15 20:49:15
【问题描述】:
我的基类中有一些事件,我想在 IDisposable 或 Finalizer 中应用以下模式。
var onCategorizedMessage = this.OnCategorizedMessage.GetInvocationList().ToList();
foreach (var item in onCategorizedMessage)
this.OnCategorizedMessage -= item;
我会在每个事件中重复此代码一次。
这是处理取消订阅事件以防止内存泄漏的合理且稳健的方式吗?
【问题讨论】:
-
在许多情况下,这并不是一个真正的问题。生产者会比消费者活得更久吗?
-
@BryanCrosby - 我不知道。我正在创建一个 HubTransport 代理,但不知道托管代码中会发生什么。 msdn.microsoft.com/en-us/library/dd877026(v=exchg.140).aspx
-
从逻辑上讲,我认为退订是退订者本身的责任。除此之外,在处理时清除调用列表没有多大意义。但是,在处理事件时(从取消订阅者本身)取消订阅是一个重要的点(以防止事件的调用列表具有对已处理对象的方法的委托)。
标签: c# events memory-leaks event-handling robustness