我有一个程序运行另一个(让我们打电话给第一个应用程序和第二个应用程序 – 工人)。
我用
process.start(); process.waiForExit(); process.Close();
在起动器。
但是,如果Starter在等待Worker时被迫closures(出于某种外部原因),Worker将仍然在进程中,阻塞文件,进食内存等。
所以,我想先检查一下Worker是否已经运行,然后再尝试启动它。 我试过Process.GetProcessesByName(“worker.exe”),但没有运气(即使我可以看到在任务pipe理器工人)。
我在这里看到了一些关于检查模块内存中每个进程的主题,但是我仍然知道运行的文件,我希望避免这种解决scheme。
任何build议?
在启动Worker进程时,将其ID保存在应用程序的配置/设置文件中,这样当您启动Starter进程时,它将首先从设置文件加载该ID,并检查该进程当前是否正在运行。 如果你想立即关闭Worker进程,你可以调用process.Kill()
。
你无法找到它的原因是因为你正在使用.exe。 如果可执行文件在TaskManager中显示为worker.exe,只需调用:
Process[] workers = Process.GetProcessesByName("worker") foreach (Process worker in workers) { worker.Kill(); worker.WaitForExit(); worker.Dispose(); }
这很容易…
System.Diagnostics.Process.Start("cmd.exe","/c taskkill /IM notepad.exe");
这段代码将关闭记事本(如果它正在运行)。 键入要使用扩展名(.exe)关闭的程序名称。
有些应用程序不能被强制停止。 在taskkill
之后使用/F
来强制执行动作。 如果要关闭进程树,请使用程序名称后面的/T
System.Diagnostics.Process.Start("cmd.exe","/c taskkill /F /IM notepad.exe /T");
当您调用GetProcessesByName(“工作人员”)您不指定exe扩展名在MSDN中解释
如果你想用你已经开始的过程对象保持一个全局变量,你可以简单地使用process.Kill();
如果您只需要检测 “worker”正在运行,那么技术上更优越的解决方案就是在整个生命周期内锁定全局互斥锁 。 任何知道互斥锁名称的进程(在你的控制下)都可以看到互斥锁是否被锁定(如果是,worker正在运行)。
然而,这样做不容易正确实施,因为有许多小细节想要恰到好处; 即使这样,“起动员”和“工作者”的竞争状态也可能同时启动等等(当然,这个问题等等,也适用于所有其他解决方案,因此不能被认为是缺点)。