2009-02-06 30 views
2

当我注销/关机时,我的winforms应用程序没有很好地关闭。我有一个主窗体,其关闭事件被正确触发,但必须有别的东西保持我的应用程序。如果我检查Application.OpenForms,那只是我的一个主要形式。为什么我的应用程序不能关闭logoff/shutdown(c#/ .net winforms)?

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

我想我正在清理所有的表单对象等,并适当地调用FinalReleaseComObject(),但我想有一些引用保持我的进程打开。有没有什么办法可以解决阻止我的应用程序正常关闭的功能?

回答

1

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

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

3

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

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

+0

我不是自己启动任何线程,但我确实从各种IE线程获得回调。所以我的代码在多个线程上执行,但我不启动它们,所以我想这不是我的工作来阻止它们。 – Rory 2009-02-06 17:15:32

+0

你有没有检查过,确保你所有的IE回调函数都返回到IE?您还可以检查Visual Studio中的应用程序中运行了哪些线程(Debug-> Windows-> Threads)。显然,它可能不是一个线程,但它是一个地方。 – Bearddo 2009-02-06 17:40:55

0

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

只要确保不要在正在工作的主(UI)线程(接收关闭事件的线程)上调用.Abort()。所以一定要检查你当前的线程(System.Threading.Thread)是不是你要中止的线程。

相关问题