我正在尝试关闭C#中的进程,但如何检查是否先打开?用户要求此功能,其中一些仍将使用其他进程的关闭按钮。
所以,现在工作正常:
Process.GetProcessesByName("ProcessName")[0].CloseMainWindow();
现在,我如何首先检查它是否存在,这不起作用:
if ( Process.GetProcessesByName("ProcessName")[0] != null ) {...}
答案 0 :(得分:18)
尝试此操作以避免在第一次调用GetProcessesByName
后进程关闭的竞争条件:
Process[] processes = Process.GetProcessesByName("ProcessName");
if (processes.Length > 0)
processes[0].CloseMainWindow();
答案 1 :(得分:8)
如果您计划在各种计算机上部署此应用程序,您将需要知道此代码有时会失败。
.NET中的Process
类基于Windows性能计数器,可以通过注册表禁用某些计算机上的计数器。发生这种情况时,对Process.GetProcessesByName
方法的调用将引发异常。
我认为这种情况对于具有各种“清理/性能调整”应用程序的机器来说是典型的,其中包括禁用性能计数器以便提高机器的性能。
过去这种情况一再让我的客户端机器有一定比例的痛苦,这使我开始探索其他(如果有些限制或麻烦)替代方案,比如使用PInvoke直接调用Win API来迭代过程
另一种可能的解决方案是确保您的安装程序或应用程序启用性能计数器,或者至少知道如何处理它们被禁用。
答案 2 :(得分:6)
怎么样
if (Process.GetProcessesByName("ProcessName").Length > 0) {...}
答案 3 :(得分:4)
您也可以循环播放,如果没有,则可以正常工作。
foreach(Process p in Process.GetProcessesByName("ProcessName"))
{
p.CloseMainWindow();
}
答案 4 :(得分:2)
Process.GetProcessesByName("ProcessName").FirstOrDefault() != null
答案 5 :(得分:0)
您可以像这样使用GetProcessesByName
:
foreach(var application in Process.GetProcessesByName("ApplicationName"))
{
application.CloseMainWindow();
}
如果您打算终止该应用程序,则可以执行以下操作:
foreach(var application in Process.GetProcessesByName("ApplicationName"))
{
application.Kill();
}