【问题标题】:Raise event in C# when another process exits当另一个进程退出时在 C# 中引发事件
【发布时间】:2012-11-21 00:56:27
【问题描述】:

我不知道这个问题是否已经被问过,但我在上面找不到任何东西,所以如果你能找到东西,请引导我朝着正确的方向前进。

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

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

补充:我的程序没有启动进程example.exe。

【问题讨论】:

标签: c# wpf events process


【解决方案1】:

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

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

【讨论】:

  • 问题是:我没有开始这个过程,我不能指定什么会开始它。但感谢您的快速回答,我将此信息添加到问题中。
  • 我可以简单地指定进程的名称而不从当前列表中查找吗?
  • @phil13131:你什么意思?这份清单在哪里?
  • 对不起,我指的是当前进程列表。我可以不通过GetProcessByName 获取进程,而是简单地使用字符串来指定进程吗?因为,在我想添加事件时,我可能不知道该过程是否已经开始。
  • 请将您的方法名称从Process.GetProcessByName 更正为Process.GetProcessesByName
【解决方案2】:

即使您不是进程的所有者,也可以使用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 周围创建一个简单的包装器。

【讨论】:

    猜你喜欢
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    相关资源
    最近更新 更多