关于HasExited触发Exited事件的问题
最近在写一个Online Judge的系统,里面用到Process类。
Process类有一个Exited事件,看看MSDN的解释:
Exited 事件指示关联进程已退出。发生这种情况表示进程终止(已中止)或成功关闭。仅当 EnableRaisingEvents 属性的值为 true 时才发生此事件。
这又涉及到EnableRaisingEvents这个属性,MSDN的意思是,只有值为True,才会触发Exited事件,否则即使程序退出,也不会触发Exited事件。
可是我写了如下程序,还是触发了Exited事件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace Test
{
class Program
{
public static void Main()
{
Process p = new Process();
p.StartInfo.FileName = "return0.exe";
p.EnableRaisingEvents = false;
p.Exited += new EventHandler(Process_Exited);
p.Start();
p.WaitForExit(1000 * 5);
if (p.HasExited == false) p.Kill();
for (int i = 0; i < 10000000; i++)
{
int pp = i;
}
}
private static void Process_Exited(object sender, EventArgs e)
{
Console.WriteLine("触发Exited事件");
}
}
}
运行结果:
还是触发了Exited事件……
对于这个问题,研究了好久,根据程序自动退出/操作系统关闭程序/process.kill结束程序三种情况,做了多次实验发现…
EnableRaisingEvents为False时,程序结束的确不会触发Exited事件…
但是一旦访问HasExited属性,如果Exited事件没有触发过,那么将会触发一次Exited事件
不知道这个问题是不是微软.net库的一个BUG,有兴趣的也烦请测试一下。
有问题的请留言批评指正。
热爱生活,热爱技术;自强不息,厚德载物。