我有一个程序运行另一个程序(我们将第一个应用程序称为 Stater,将第二个应用程序称为 -
Worker
)。
我用:
process.start();
process.waiForExit();
process.Close();
在启动器中。
但是,如果 Starter 在等待 Worker 时被迫关闭(由于某些外部原因)
Worker
将仍在进程中,阻塞文件,占用内存等。
所以,我想检查
Worker
是否已经在运行。在此之前,我会尝试启动它。
我已经尝试过
Process.GetProcessesByName("worker.exe")
但没有运气(即使我可以在任务管理器中看到 Worker
)。
我在这里看到了一些关于检查内存中每个进程的模块的主题,但我仍然知道正在运行的文件,我希望避免这种解决方案。
有什么建议吗?
您找不到它的原因是您正在使用.exe。如果可执行文件在任务管理器中显示为worker.exe,只需调用:
Process[] workers = Process.GetProcessesByName("worker")
foreach (Process worker in workers)
{
worker.Kill();
worker.WaitForExit();
worker.Dispose();
}
在启动 Worker 进程时,将其 ID 保存在应用程序的配置/设置文件中,这样当您启动 Starter 进程时,它将首先从设置文件中加载该 ID,并检查该进程当前是否正在运行或不是。如果你想立即关闭Worker进程,可以调用
process.Kill()
。
这容易多了...
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");
当您调用 GetProcessesByName("worker") 时,您没有指定 exe 扩展名,如 MSDN
中所述
如果您希望使用已启动的进程对象保留全局变量,您可以简单地使用 process.Kill();