为什么我的应用程序在注销/关闭时没有关闭(c#/ .net winforms)?

时间:2009-02-06 16:51:38

标签: c# .net winforms com shutdown

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

棘手的问题,问题可能在于,我的应用程序使用ShellWindows挂钩到Internet Explorer,偶尔会在IE事件触发时打开表单。在打开和关闭这些表单中的一个或多个之后,我的应用程序在关闭时停止关闭。

我认为我正在清理所有表单对象并适当地调用FinalReleaseComObject(),但我猜有些引用正在保持我的进程打开。有没有什么方法可以解决阻止我的应用程序优雅关闭的问题?

3 个答案:

答案 0 :(得分:3)

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

如果线程结束并不重要,请将IsBackground设置为true。你也可以在一个线程上调用Abort来(有时)强行杀死它。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这是一种非常丑陋的方法,但是如果您要做的就是杀死任何悬而未决的线程,您可以使用System.Diagnostics.Process.GetCurrentProcess.Threads获取应用程序中运行的所有线程,以及然后枚举它们并在它们上调用Thread.Join()或Thread.Abort()。

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