杀死不会杀死进程

问题描述:

有没有人需要处理尝试杀死Windows Mobile 5设备上的应用?杀死不会杀死进程

这是一个.NET 3.5 WinForms应用程序有许多后台线程似乎不被清理正确时抛出一个异常。我想,哪一个是杀人案发生的情况。因此,在这两种情况下,该过程都会显示一些3个后台线程,并且在没有重置的情况下它不会消失。

有什么办法来消除其他这样的过程比实际代码中修正错误?

您需要了解线程如何,至少在CE(以及可能的桌面)的工作。通常,当进程的主(入口)线程退出时,OS调度程序会被通知,并且所有的工作线程都会被安排终止。下一次这些线程要求量子(一段处理时间)时,它们被杀死 - 这是重要的一点。

如果背景线程处于阻塞操作系统调用“卡住”(例如WaitForSingleObject(INFINITE)),那么该线程将永远不会从调度请求量子。如果从来没有要求调度器有时间来运行线程,则线程永远不会有机会实际终止。

这是工作线程应该总是总是在其活动循环中有一个超时的主要原因(我认为如果您在任何地方使用无限超时,则可能是错误的)。即使超时返回并再次等待,它也使调度程序有机会终止线程。

你可以尝试使用TOOLHELP API来终止该进程(IIRC将暂停和恢复工作线程,给调度机会做它的工作)。我不确定它会工作,但P/Invoke很容易尝试。

+0

感谢您的宝贵信息。尽管我最终必须清理那个应用程序,但我会尝试使用toolhelp API路线。 – 2012-03-03 21:30:05

您的应用程序是否跟踪它正在使用的后台线程?我知道在一个Windows窗体应用程序中,抛出一个异常并杀死主应用程序线程可以让后台线程运行,即使你终止了应用程序。如果应用程序正在跟踪,则可以在应用程序崩溃之前显式终止后台线程作为异常处理的一部分。

否则,您可以定期检查在后台线程来看看主应用程序仍在运行,如果不是的话,让他们自杀。不是很干净,但另一种可能性。

+0

正如我在我的问题中提到的,它很可能不会被清理干净。我只是想知道是否有办法杀死这样的应用程序,无论如何。这不是我的应用程序,我正在寻找一个简单的方法:) – 2012-03-03 05:05:23