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

时间:2012-12-03 14:27:32

标签: c# wpf events process

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

基本上,当我退出另一个指定进程(“example.exe”)时,我想向当前的C#程序添加一个事件。这可能吗?

如果那是不可能的,那么是否存在通过直接路径(“C:\ somefolderpaths ... \ example.exe”)退出指定进程时引发事件的方法?

要添加:我的程序不会启动进程example.exe。

2 个答案:

答案 0 :(得分:3)

如果您使用的是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");

通过这种方式,您可以避免阻止主线程,并在外部进程退出时运行您需要的代码。同时,继续做更重要的事情。

答案 1 :(得分:0)

即使您不是流程的所有者,也可以使用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,最好是超时。或者您可以围绕RegisteredWaitHandleawait

创建一个简单的包装器