当另一个进程退出时,在C#中引发事件

我不知道这个问题是否已被提出,但我找不到任何内容,所以如果你能找到一些东西,请引导我朝着正确的方向前进。

基本上,我想在我的当前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 ,最好是超时。 或者您可以在RegisteredWaitHandle周围创建一个简单的包装器并await