杀死并不会杀死一个进程

时间:2012-03-03 04:55:22

标签: .net windows-mobile compact-framework

是否有人必须处理试图杀死Windows Mobile 5设备上的应用程序?

这是一个.net 3.5 winforms应用程序,它有许多后台线程,在抛出异常时似乎没有正确清理。我猜,在发布杀戮的情况下也是如此。因此,在这两种情况下,流程都会显示3个后台线程,如果没有重置,它就不会消失。

除了实际修复代码中的错误之外,有没有办法消除这样的过程?

2 个答案:

答案 0 :(得分:2)

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

如果后台线程在阻塞的OS调用中“卡住”(例如WaitForSingleObject(INFINITE)),那么该线程将永远不会从调度程序请求量子。如果永远不会要求调度程序运行该线程,则永远不会给该线程实际终止。

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

您可以尝试使用toolhelp API来终止进程(IIRC将暂停和恢复工作线程,使调度程序有机会完成它的工作)。我不确定它会起作用,但P / Invoke很容易尝试。

答案 1 :(得分:0)

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

否则,您可以定期检查后台线程以查看主应用程序是否仍在运行,如果不是,请让它们自行终止。不太干净,但另一种可能性。