关于HasExited触发Exited事件的问题

最近在写一个Online Judge的系统,里面用到Process类。

Process类有一个Exited事件,看看MSDN的解释:

Exited 事件指示关联进程已退出。发生这种情况表示进程终止(已中止)或成功关闭。仅当 EnableRaisingEvents 属性的值为 true 时才发生此事件。

这又涉及到EnableRaisingEvents这个属性,MSDN的意思是,只有值为True,才会触发Exited事件,否则即使程序退出,也不会触发Exited事件。

可是我写了如下程序,还是触发了Exited事件

隐藏行号 复制代码 这是一段程序代码。
  1. using System;
    
  2. using System.Collections.Generic;
    
  3. using System.Linq;
    
  4. using System.Text;
    
  5. using System.Diagnostics;
    
  6. 
    
  7. namespace Test
    
  8. {
    
  9.     class Program
    
  10.     {
    
  11.         public static void Main()
    
  12.         {
    
  13.             Process p = new Process();
    
  14.             p.StartInfo.FileName = "return0.exe";
    
  15.             p.EnableRaisingEvents = false;
    
  16.             p.Exited += new EventHandler(Process_Exited);
    
  17.             p.Start();
    
  18.             p.WaitForExit(1000 * 5);
    
  19.             if (p.HasExited == false) p.Kill();
    
  20.             for (int i = 0; i < 10000000; i++)
    
  21.             {
    
  22.                 int pp = i;
    
  23.             }
    
  24.         }
    
  25. 
    
  26.         private static void Process_Exited(object sender, EventArgs e)
    
  27.         {
    
  28.             Console.WriteLine("触发Exited事件");
    
  29.         }
    
  30.     }
    
  31. }
    

运行结果:

未命名图片

还是触发了Exited事件……

对于这个问题,研究了好久,根据程序自动退出/操作系统关闭程序/process.kill结束程序三种情况,做了多次实验发现…

EnableRaisingEvents为False时,程序结束的确不会触发Exited事件…

但是一旦访问HasExited属性,如果Exited事件没有触发过,那么将会触发一次Exited事件

 

不知道这个问题是不是微软.net库的一个BUG,有兴趣的也烦请测试一下。

有问题的请留言批评指正。

posted @ 2009-09-21 05:32  Probie  阅读(3400)  评论(1编辑  收藏  举报