.net - 有关如何编写静态分析规则 (FXCop) 以确保删除事件委托(delegate)的任何想法

标签 .net event-handling delegates static-analysis fxcop

我们一直在进行大量内存泄漏分析,发现影响因素之一是未删除事件上的委托(delegate),导致对象无法足够快地被 GC(有时甚至永远)。

有人知道如何在 FXCop 中编写规则以确保我们的委托(delegate)从处理程序中删除吗?

我刚刚看到this因此我会向那里询问更多信息。

最佳答案

您需要更具体。您不需要检查所有事件委托(delegate)是否已取消订阅,因为在常见情况下,订阅者的生命周期比发布者短。只有当订阅者的生命周期比发布者的生命周期更长时才会发生内存泄漏,因此存在引用,这会阻止 GC 收集发布者对象。

现在我们需要验证,如果您订阅了生命周期相对较短的对象上的事件,您最终会取消订阅它。

在这种情况下我可以提出一个启发式方法:分析所有局部变量对象(其作用域为当前代码块 {})以及您显式处理的所有对象。对于这些对象上的每个事件,都会计算您订阅它们的次数和取消订阅的次数。如果第一个数字更大,则发出警告。

当然,这并不能涵盖所有情况,但我想没有静态方法可以涵盖这个问题中的所有情况,你需要一些足够好的方法。

我不会在这里提及动态分析和代码审查的优点,因为它是一个单独的主题,与问题无关。

关于.net - 有关如何编写静态分析规则 (FXCop) 以确保删除事件委托(delegate)的任何想法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/854716/

相关文章:

c# - 更改文本的 ASP.net 进度条

JavaScript 无法在 Asp 上运行。网

javascript - React - SetState 处理程序方法

actionscript-3 - 处理来自单个监听器的多个事件

iphone - 设置与 Facebook 的连接未按预期工作 (iPhone)

c# - XmlDocument::Save() 附加文件中的 xml

c# - 如何旋转 WinRT Xaml Toolkit 柱形图的标签?

events - 使用Node.JS进行键盘事件模拟

javascript - 为什么不委托(delegate)滚动工作?

c# - 按代码排序列表,然后按名称排序