我有一个运行另一个的程序(让我们调用第一个应用程序Stater和第二个应用程序 - Worker)。
我用
process.start();
process.waiForExit();
process.Close();
在Starter。
但是如果Starter在等待Worker时被迫关闭(出于某些外部原因),Worker仍将处理进程,阻止文件,吃内存等。
所以,我想在我尝试启动之前检查Worker是否已经运行。 我已经尝试过Process.GetProcessesByName(“worker.exe”),但没有运气(即使我可以在任务管理器中看到工人)。
我在这里看到了一些关于检查内存中每个进程的模块的主题,但我仍然知道正在运行的文件,我希望避免这样的解决方案。
有任何建议吗?
答案 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,因为你想要得到很多细节;即使这样,也可能存在“起动器”和“工人”的竞争条件实际上同时启动等(当然这个问题,以及许多其他问题,也适用于所有其他解决方案,所以它不能被视为缺点)。