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

时间:2012-03-13 10:01:27

标签: c# .net windows process

我有一个运行另一个的程序(让我们调用第一个应用程序Stater和第二个应用程序 - Worker)。

我用

process.start();
process.waiForExit();
process.Close();

在Starter。

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

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

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

有任何建议吗?

5 个答案:

答案 0 :(得分:16)

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

Process[] workers = Process.GetProcessesByName("worker")
foreach (Process worker in workers)
{
     worker.Kill();
     worker.WaitForExit();
     worker.Dispose();
}

答案 1 :(得分:6)

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

答案 2 :(得分:4)

这更容易......

System.Diagnostics.Process.Start("cmd.exe","/c taskkill /IM notepad.exe");

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

如果不强制,某些应用程序无法停止。 在/F之后使用taskkill强制执行操作。 如果要关闭进程树,请在程序名称后使用/T

System.Diagnostics.Process.Start("cmd.exe","/c taskkill /F /IM notepad.exe /T");

答案 3 :(得分:2)

当你致电 GetProcessesByName(“工人”)时,你没有按照MSDN中的说明指定exe扩展名。 如果您希望使用已启动的流程对象保留全局变量,则只需使用 process.Kill();

答案 4 :(得分:2)

如果您只需检测“工作人员”正在运行,那么技术上更优越的解决方案是在其生命周期内lock a global mutex。任何知道互斥锁名称(由您控制​​)的进程都可以查看互斥锁是否被锁定(如果是,工作正在运行)。

然而这是not easy to implement correctly,因为你想要得到很多细节;即使这样,也可能存在“起动器”和“工人”的竞争条件实际上同时启动等(当然这个问题,以及许多其他问题,也适用于所有其他解决方案,所以它不能被视为缺点)。