Application.ThreadException:如果没有分离内存泄漏?

时间:2011-10-18 19:34:58

标签: .net memory-leaks

Application.ThreadException的reference page表示

  

因为这是静态事件,所以必须分离事件处理程序   处理您的应用程序时,或者会导致内存泄漏。

尽管该页面上的示例代码没有分离事件处理程序,但如果事件处理程序未分离,它是否真的会泄漏?

似乎应该分离处理程序的唯一时间是应用程序关闭。在这种情况下,无论处理程序是否已分离,应用程序使用的所有内存都将被释放?

2 个答案:

答案 0 :(得分:5)

这可能非常罕见,但WinForms应用程序的Main()方法可能由于某种原因看起来像这样:

static bool AbortStartup { get; set; }

[STAThread]
public static void Main()
{
    Application.Run(new CancelableSplashScreen());

    if (!AbortStartup)
        Application.Run(new MainWindow());
}

当启动画面关闭时,除非启动画面将AbortStatup属性设置为true,否则将显示主窗口。如果您在启动屏幕中向Application.ThreadException添加了一个事件处理程序,那么CancelableSplashScreen的实例将不会被垃圾收集,直到应用程序终止,这可能需要相当长的时间。

答案 1 :(得分:1)

如果你让对象的引用去(假设它是一个实例方法是事件处理程序)那么是的,就会有泄漏;您将无法取消订阅该事件(因为您不再拥有该实例)并且该对象将一直存在,直到应用程序域结束(因为这是静态变量的生命周期)。