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

问题描述 投票:0回答:5

我有一个程序运行另一个程序(我们将第一个应用程序称为 Stater,将第二个应用程序称为 -

Worker
)。

我用:

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

在启动器中。

但是,如果 Starter 在等待 Worker 时被迫关闭(由于某些外部原因)

Worker
将仍在进程中,阻塞文件,占用内存等。

所以,我想检查

Worker
是否已经在运行。在此之前,我会尝试启动它。

我已经尝试过

Process.GetProcessesByName("worker.exe")
但没有运气(即使我可以在任务管理器中看到
Worker
)。

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

有什么建议吗?

c# .net windows process
5个回答
32
投票

您找不到它的原因是您正在使用.exe。如果可执行文件在任务管理器中显示为worker.exe,只需调用:

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

8
投票

在启动 Worker 进程时,将其 ID 保存在应用程序的配置/设置文件中,这样当您启动 Starter 进程时,它将首先从设置文件中加载该 ID,并检查该进程当前是否正在运行或不是。如果你想立即关闭Worker进程,可以调用

process.Kill()


8
投票

这容易多了...

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");

2
投票

当您调用 GetProcessesByName("worker") 时,您没有指定 exe 扩展名,如 MSDN
中所述 如果您希望使用已启动的进程对象保留全局变量,您可以简单地使用 process.Kill();


2
投票

如果您只需要检测“worker”正在运行,技术上更优越的解决方案是让它在其生命周期内锁定全局互斥体。任何知道互斥体名称(在您的控制之下)的进程都可以查看互斥体是否被锁定(如果是,则工作线程正在运行)。

然而,这正确实施并不容易,因为有很多小细节你想要恰到好处;即使这样,也可能存在“starter”和“worker”实际上同时启动的竞争条件等(当然这个问题和许多其他问题也适用于所有其他解决方案,因此不能被视为缺点)。

© www.soinside.com 2019 - 2024. All rights reserved.