如何在C#中停止进程,知道它的文件名?

Pav*_*yan 7 .net c# windows process

我有一个运行另一个的程序(让我们调用第一个应用程序Stater和第二个应用程序 - 工作者).

我用

process.start();
process.waiForExit();
process.Close();
Run Code Online (Sandbox Code Playgroud)

在初学者.

但是如果Starter在等待Worker时被迫关闭(出于某些外部原因),Worker仍将处理进程,阻塞文件,吃内存等.

所以,我想在我尝试启动之前检查Worker是否已经运行.我已经尝试过Process.GetProcessesByName("worker.exe")但没有运气(即使我可以在任务管理器中看到Worker).

我在这里看到了一些关于检查内存中每个进程的模块的主题,但我仍然知道正在运行的文件,我希望避免这样的解决方案.

有什么建议吗?

Tun*_*ung 18

你无法找到它的原因是因为你正在使用.exe.如果可执行文件在TaskManager中显示为worker.exe,则只需调用:

Process[] workers = Process.GetProcessesByName("worker")
foreach (Process worker in workers)
{
     worker.Kill();
     worker.WaitForExit();
     worker.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

  • 我赞成它(100%正确答案!),但保存ID到列表的那个是我最喜欢的. (2认同)

Cod*_*der 7

在启动工作进程时,将其ID保存在应用程序的配置/设置文件中,这样当您启动Starter进程时,它将首先从设置文件中加载该ID,并检查该进程当前是否正在运行.如果要立即关闭工作进程,可以调用process.Kill()它.

  • 注意:在Starter进程重新启动时,ID可能已被回收(对于不同的进程).您需要进行额外的检查以确保它实际上(仍然)是您认为的过程. (2认同)

Ros*_*ala 6

这要容易得多...

System.Diagnostics.Process.Start("cmd.exe","/c taskkill /IM notepad.exe");
Run Code Online (Sandbox Code Playgroud)

此代码将关闭记事本(如果它正在运行)。键入要关闭的程序名称及其扩展名 (.exe)。

某些应用程序无法在不强制的情况下停止。使用/Faftertaskkill强制操作。如果要关闭进程树,请/T在程序名称后使用。

System.Diagnostics.Process.Start("cmd.exe","/c taskkill /F /IM notepad.exe /T");
Run Code Online (Sandbox Code Playgroud)