c# - 你如何找出在 C# 中订阅了一个事件的内容?

标签 c# debugging events

我遇到了一个问题,我正在处理的应用程序存在内存泄漏。经验告诉我,垃圾收集语言遇到内存泄漏的第一个地方是处理订阅事件和未能取消订阅事件。第二个与存储静态有关。我是 C# 的新手,对不透明的事件类型感到很沮丧。

我们幸运地发现了一些双重订阅错误,但该应用程序确实将事件用于许多事情。虽然我们很清楚取消订阅您订阅的所有内容的原则,但仍然存在内存泄漏。我想系统地确定什么订阅了什么。

编辑:

感谢您提供指向 GetInvocationList() 方法的指针。我正在尝试创建一个将动态转储结果的调试工具。问题是我找到的解决方案在 .Net 2 中有效,但在 .Net 3.5 中不再有效。本质上,它告诉您为 EventInfo 获取相应的 FieldInfo(分别为反射、GetField 和 GetEvents)。但是.Net 3.5中没有对应的FieldInfo,EventInfo也不让我获取调用列表。

我只想转储事件列表及其 InvocationList 以进行调试。

最佳答案

尝试在名为 GetInvocationListevent 上使用方法。

这将返回订阅事件的委托(delegate)数组。

数组将按照添加顺序包含委托(delegate)。这也可用于从列表中挑出并调用特定的委托(delegate),而调用 event.Invoke 方法将调用它们(但只为您提供最后调用的委托(delegate)的返回值)

关于c# - 你如何找出在 C# 中订阅了一个事件的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4400211/

相关文章:

c# - NancyFx 测试返回无效的 Json

c# - 如何注册ServiceBusClient进行依赖注入(inject)?

debugging - 调试 web2py 应用程序的不同方法

java - 如何在 JavaFX 中以编程方式触发鼠标事件?

Jquery点击html标签时触发两次事件

c# - 我怎样才能在C#中获取字符串的前十个字符

c# - 如何使 TreeView 背景色透明?

Android: 在 galaxy s2 中使用 Debug模式

ios - iOS设备上的Phonegap调试需要拔出/插入才能工作

c++ - 如何减少事件总线实现中的耦合