【问题标题】:Unsubscribing event handlers using GetInvocationList使用 GetInvocationList 取消订阅事件处理程序
【发布时间】: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


【解决方案1】:

没有必要使用forforeach,因为您可以访问支持字段(存储代表),您只需要这样做:

this.OnCategorizedMessage = null;

有关更多信息,您可以在此处查看: http://www.codeproject.com/Articles/864690/Simplifying-Events-in-NET

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多