【问题标题】:Does System.Windows.Forms.Application.Run(form); require form.Dispose()?是否 System.Windows.Forms.Application.Run(form);需要 form.Dispose()?
【发布时间】:2012-09-24 17:03:33
【问题描述】:

根据MSDN

如果表单使用 显示方法。如果使用了 ShowDialog 等其他方法,或者表单 根本没有显示,你必须在你的内部调用 Dispose 应用。

如果我通过以下方式启动表单会发生什么

System.Windows.Forms.Application.Run(form);?

关闭表单允许继续执行。如果我在块之后调用 form.ShowDialogue(),它会抛出一个ObjectDisposedException。可以肯定的是,通过Application.Run() 启动表单时是否需要调用form.Dispose() 或者这样做有什么好处或坏处?

【问题讨论】:

    标签: winforms


    【解决方案1】:

    ApplicationContext 类控制 UI 线程的生命周期。它的 ExitThread() 方法启动退出内部消息循环的关闭。当您使用 Application.Run(Form) 重载时,Winforms 会使用 ApplicationContext(Form) 构造函数创建一个 ApplicationContext。其中订阅表单的 HandleDestroyed 事件,事件处理程序调用 ExitThread()。

    所以生命周期完全取决于窗体的本机 Windows 窗口是否处于活动状态。销毁该窗口的两种常见方法是用户单击窗口的关闭按钮或您的应用程序调用 Close 或 Dispose 方法。无论哪种方式,表单都会自动处理。此后表单对象已死,试图恢复它会引发 ODE。

    【讨论】:

    • 我有一些遗留代码在应用程序代码中使用Application.Run(form) 启动表单。对我来说,这似乎很奇怪。为什么这样做而不是form.ShowDialogue()
    • NM 找到了一个关于这个主题的好帖子:stackoverflow.com/questions/2314514/…
    【解决方案2】:

    发布后不久,我在MSDN的另一个区域找到了答案

    Form 类的 Dispose 方法将在 返回此方法。

    【讨论】:

      猜你喜欢
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 2019-08-19
      • 2014-10-30
      • 1970-01-01
      • 2011-03-07
      • 2020-11-06
      相关资源
      最近更新 更多