我大约一个月前安装了 Windows 8,并且一直遇到问题,当进程挂起时我无法结束/终止它。任务管理器和 CMD Taskkill /f /PID #### 都无法完成这项工作,所以我想我应该用 C# 编写自己的进程杀手,看看会出现什么问题。
在编写了一个小应用程序后,我意识到我并不像我想象的那么聪明 - 我仍然无法结束这个过程。起初我能够通过名称/PID 找到进程:
Process p = Process.GetProcessById(aPid)
//or
foreach (Process p in Process.GetProcessesByName(aProcessName)
..当我尝试执行以下操作时,出现“访问被拒绝”异常:
process.Kill();
..经过几次尝试后,我将无法再找到该过程。例如。当我尝试通过名称或 PID 查找它时,没有返回任何内容,而该进程仍然保留在任务管理器和我的屏幕上。
我还阅读了 Process @MSDN,它说如果进程已经终止或无法终止,则可以抛出“访问被拒绝”。:(
帮助?真的没有办法强制结束进程吗?
好吧,您实际上遇到了阻止任务管理器终止进程的相同问题。有两个可能的原因。一种与拒绝访问异常相关,该进程可能已经删除了其他进程的访问权限以获取该进程的句柄。由于您在 Windows 8 上运行,因此您已经安装了 .NET 4.5。其中为Process类提供了一个新的方法,你可以调用EnterDebugMode()
。这使得SeDebugPrivilege
,现在可能已经足够好了Kill()
work.
另一个是一个更大的问题,进程可能有一个处于内核模式但未退出的活动线程。诊断的最佳方法是使用任务管理器的“详细信息”选项卡,右键单击列标题之一并选择“选择列”。勾选“手柄”。查看进程的显示值。如果您看到非零值,则该进程很可能打开了句柄并正在等待设备驱动程序执行 I/O 请求。而且该设备驱动程序不会受到 Windows 要求其取消请求的影响。缩小麻烦制造者的范围并不那么容易,您必须更多地了解您的进程到底执行哪种 I/O 请求。通过在 superuser.com 上询问相关问题来跟进此问题
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)