【发布时间】:2023-03-11 03:45:01
【问题描述】:
我正在处理的应用程序存在内存泄漏问题。经验告诉我,垃圾收集语言最先遇到内存泄漏的地方之一是处理订阅事件并且以后无法取消订阅。第二个与存储静态有关。我是 C# 新手,对不透明的事件类型感到很沮丧。
我们通过抽签发现了一些双重订阅错误,但该应用程序确实将事件用于许多事情。虽然我们很清楚取消订阅您订阅的所有内容的原则,但仍然存在内存泄漏。我想系统地确定订阅了什么。
编辑:
感谢您提供指向 GetInvocationList() 方法的指针。我正在尝试创建一个可以动态转储结果的调试工具。问题是我发现的解决方案在 .Net 2 中有效,但在 .Net 3.5 中不再有效。本质上,它告诉您为 EventInfo 获取相应的 FieldInfo(分别为反射、GetField 和 GetEvents)。但是.Net 3.5中没有对应的FieldInfo,EventInfo也不会让我得到调用列表。
我只想转储事件列表及其 InvocationList 以进行调试。
【问题讨论】:
-
查看我上个月对类似问题的回答,C# Event Based Memory Leaks。
-
我很难选择这两者中的哪一个应该得到“官方”答案,因为它们都解决了我需要的不同部分。最后我选择了回答标题中问题的那个,虽然 n8wrl 的回答在不同方面都一样好。