Application.ThreadException的reference page表示
因为这是静态事件,所以必须分离事件处理程序 处理您的应用程序时,或者会导致内存泄漏。
尽管该页面上的示例代码没有分离事件处理程序,但如果事件处理程序未分离,它是否真的会泄漏?
似乎应该分离处理程序的唯一时间是应用程序关闭。在这种情况下,无论处理程序是否已分离,应用程序使用的所有内存都将被释放?
答案 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)
如果你让对象的引用去(假设它是一个实例方法是事件处理程序)那么是的,就会有泄漏;您将无法取消订阅该事件(因为您不再拥有该实例)并且该对象将一直存在,直到应用程序域结束(因为这是静态变量的生命周期)。