2

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

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

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

4

3 回答 3

3

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

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

于 2009-02-06T17:07:34.183 回答
1

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

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

于 2009-02-06T17:22:39.533 回答
0

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

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

于 2009-02-08T01:36:38.103 回答