我不知道这个问题是否已经被问过,但我找不到任何东西,所以如果你能找到一些东西,请引导我朝着正确的方向前进。
基本上,我想在我当前的 C# 程序中添加一个事件,以便在另一个指定进程(“example.exe”)退出时引发。那可能吗?
如果这不可能,是否有一种方法可以在通过直接路径(“C:\somefolderpaths...\example.exe”)退出指定进程时引发事件?
添加:我的程序没有启动进程 example.exe。
如果您使用的是 C# 4.0,您可以执行以下操作:
Task.Factory.StartNew(() =>
{
var process = Process.Start("process.exe");
process.WaitForExit();
}).ContinueWith(
//THE CODE THAT WILL RUN AFTER PROCESS EXITED.
);
编辑
如果您不是流程的创建者,您可以使用Process.GetProcessesByName函数从已经可用的流程中检索流程。
var process = Process.GetProcessesByName("process.exe");
通过这种方式,您可以避免阻塞主线程,并在外部进程退出时运行您需要的代码。同时,继续做更重要的事情。
Exited
即使您不是流程的所有者,也可以使用该事件。这段代码工作得很好:
var proc = Process.GetProcessesByName("notepad")[0];
proc.EnableRaisingEvents = true;
proc.Exited += (s, e) => { Console.Write("Done"); };
EnableRaisingEvents
发生在 .NET 端,与进程的创建无关 - 它与等待进程句柄发出信号有关。您可以使用任何等待句柄(并且进程也是等待句柄)来执行此操作,例如:
var registration
= ThreadPool.RegisterWaitForSingleObject(waitHandle, callbackMethod, null, -1, true);
您实际使用单独线程(来自线程池)的唯一时间是在执行回调时。无需在等待时浪费线程什么都不做。
当然,如果你想在同步过程中等待,你仍然可以调用WaitForExit
,最好是超时。或者您可以在 and 周围创建一个简单的包装RegisteredWaitHandle
器await
。