【问题标题】:C# killing a labview appC#杀死一个labview应用程序
【发布时间】:2015-12-17 17:21:47
【问题描述】:

我在终止 labview 进程时遇到问题。到目前为止,我正在使用此代码:

string NombreProceso = "FORD EPB FINAL Laser";
Process[] ps = Process.GetProcessesByName(NombreProceso);
if (ps.Count() == 0)
{
     TextBox_Eventos.AppendText("[+]   " + DateTime.Now.ToString("hh:mm:ss") + " | No se encontró proceso\n");
     return;
}

foreach (Process p in ps)
{
     p.kill();

     TextBox_Eventos.AppendText("[+]   " + DateTime.Now.ToString("hh:mm:ss") + " | Cerrando proceso\n");
}

问题是进程没有完成(看起来 p.kill() 不工作)。我收到异常:“没有进程与此对象关联”。我只是在寻找一个可以帮助我像任务管理器一样杀死这个进程的功能。

【问题讨论】:

  • 记录它实际找到的进程数,如果它不止一个,你可能会遇到一个进程与其他进程通信并使你的集合无效的混乱(例如杀死一个进程会杀死其他进程)。还要检查 PID 以 100% 确认它没有死,也许新进程产生了替换旧进程。除此之外,我看不出代码有什么问题。
  • 只是一个想法:我会尝试使用带有索引变量而不是 foreach 的普通 for 循环。
  • 可能你运行kill时进程已经不存在了?
  • 附带说明,这似乎与labview没有任何关系,请考虑从问题中删除该标签。
  • @HansPassant 在这里不可能是这样,否则 GetProcessesByName 将返回一个空数组。

标签: c# system.diagnostics


【解决方案1】:

就文档而言,无法确定对象是否与进程相关联。做你想做的唯一方法是将调用包装在一个 try-catch 块中:

string NombreProceso = "FORD EPB FINAL Laser";
Process[] ps = Process.GetProcessesByName(NombreProceso);
if (ps.Count() == 0)
{
    TextBox_Eventos.AppendText("[+]   " + DateTime.Now.ToString("hh:mm:ss") + " | No se encontró proceso\n");
        return;
}
foreach (Process p in ps)
{
   try
   {
       p.kill();
   }
   catch (InvalidOperationException) {}

    TextBox_Eventos.AppendText("[+]   " + DateTime.Now.ToString("hh:mm:ss") + " | Cerrando proceso\n");
}

您还可以尝试查看对象有多少句柄,因为 Process.Kill() 首先需要获取对象的句柄,因此对象需要至少有一个句柄,以便 Process.Kill() 不抛出无法获取句柄时的异常,如您在ReferenceSource 中所见。

string NombreProceso = "FORD EPB FINAL Laser";
Process[] ps = Process.GetProcessesByName(NombreProceso);
if (ps.Count() == 0)
{
    TextBox_Eventos.AppendText("[+]   " + DateTime.Now.ToString("hh:mm:ss") + " | No se encontró proceso\n");
        return;
}
foreach (Process p in ps)
{
   try
   {
       if (p.Handles > 0)
          p.Kill();
   }
   catch (InvalidOperationException) {}

    TextBox_Eventos.AppendText("[+]   " + DateTime.Now.ToString("hh:mm:ss") + " | Cerrando proceso\n");
}

【讨论】:

  • 如果您查看链接页面,您会看到HasExited 也会抛出InvalidOperationException 如果没有与该对象关联的进程。 所以大概,不管是什么导致的问题,都不会这样解决。
  • 另外,杀死一个已经被杀死的任务应该会给你消息Cannot process request because the process has exited
  • @MattBurland 看到我的编辑,这就是我可以从文档和源代码中得出的结论
猜你喜欢
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 2020-01-07
相关资源
最近更新 更多