【问题标题】:Why does my application not close on logoff/shutdown (c#/.net winforms)?为什么我的应用程序在注销/关闭时没有关闭(c#/.net winforms)?
【发布时间】:2009-02-06 16:51:38
【问题描述】:

当我注销/关闭时,我的 winforms 应用程序没有很好地关闭。我有一个主窗体,它的 Closing 事件被正确触发,但必须有其他东西保持我的应用程序。如果我检查 Application.OpenForms,那只有我的一个主表单。

棘手的一点,也就是问题所在,是我的应用程序使用 ShellWindows 连接到 Internet Explorer,并且偶尔会在 IE 事件触发时打开表单。在打开和关闭这些表单中的一个或多个之后,我的应用程序在关机时停止关闭。

我想我正在清理所有表单对象等并适当地调用 FinalReleaseComObject(),但我想在某处有引用使我的进程保持打开状态。有什么办法可以弄清楚是什么阻止了我的应用正常关闭?

【问题讨论】:

    标签: c# .net winforms com shutdown


    【解决方案1】:

    如果有未设置为后台的线程正在运行,应用程序也将保持打开状态。如果您正在创建自己的任何线程,请确保它们正确终止。

    如果线程完成并不重要,请将IsBackground 设置为true。您还可以在线程上调用 Abort 以(某种程度上)强行杀死它。

    【讨论】:

    • 我没有自己启动任何线程,但我确实收到了来自各种 IE 线程的回调。所以我的代码在多个线程上执行,但我没有启动它们,所以我想阻止它们不是我的工作。
    • 您是否检查以确保所有来自 IE 的回调都将控制权返回给 IE?您还可以在 Visual Studio 中检查您的应用程序中正在运行的线程(调试->Windows->线程)。显然,它可能不是线程的东西,但它是一个可以查看的地方。
    【解决方案2】:

    最可能的原因是当您的应用程序的主窗口关闭时,您有一个未关闭的后台线程。根据您的设置和框架版本,后台线程可以在主线程终止时使应用程序保持活动状态。

    在关闭期间,窗口通常通过向进程的主窗口发送 WM_QUIT 来要求每个正在运行的应用程序终止。 WinForms 会很高兴地使用此消息来关闭主窗口,但如果留下任何后台线程,实际进程可以继续。

    【讨论】:

    • 我相信是这样的:我们正在接收来自 COM 的多个线程的调用,并在这些线程中创建 UI 元素。关于创建 UI 元素的一些事情意味着线程无法正确关闭、徘徊并阻止应用程序正常关闭。我相信切换到使用单线程进行所有 UI 交互可以解决问题,但现在我们只是在希望它关闭时终止进程:-/
    【解决方案3】:

    这是一种非常丑陋的方法,但如果您只想杀死任何挂起的线程,您可以使用 System.Diagnostics.Process.GetCurrentProcess.Threads 让所有线程在您的应用程序中运行,并且然后枚举它们并在它们上调用 Thread.Join() 或 Thread.Abort()。

    请确保不要在您正在使用的主 (UI) 线程(接收 Closing 事件的线程)上调用 .Abort()。因此,请务必检查您当前的线程 (System.Threading.Thread) 是否不是您要中止的线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多