为什么我的进程的退出方法没有被调用?

5Yr*_*DBA 90 .net c#

我有以下代码,但为什么ProcessExited从未调用该方法?如果我不使用Windows shell(startInfo.UseShellExecute = false),它也是一样的.

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = true;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = path;
startInfo.Arguments = rawDataFileName;
startInfo.WorkingDirectory = Util.GetParentDirectory(path, 1);

try
{
     Process correctionProcess = Process.Start(startInfo);
     correctionProcess.Exited += new EventHandler(ProcessExited);                   

     correctionProcess.WaitForExit();

     status = true;
}
Run Code Online (Sandbox Code Playgroud)

.....

internal void ProcessExited(object sender, System.EventArgs e)
{
      //print out here
}
Run Code Online (Sandbox Code Playgroud)

Eli*_*sha 228

要在Exited事件上接收回调,EnableRaisingEvents必须将其设置为true.

Process correctionProcess = Process.Start(startInfo);
correctionProcess.EnableRaisingEvents = true;
correctionProcess.Exited += new EventHandler(ProcessExited); 
Run Code Online (Sandbox Code Playgroud)

  • 一个小技巧(特别是非C#专家):不要'关闭()`这个过程!由于资源管理的误导,我遇到了Exit处理程序的间歇性问题.有问题的代码在`Process.Start(startInfo)`之后调用了`Process.Close()`,而不是允许GC在适当的时候收集它.如果您的背景是非GC语言(例如C/C++),则容易出错. (6认同)
  • correctionProcess.WaitForExit(),没有这个函数,这段代码对我不起作用 (3认同)
  • 大.谢谢.我还要注意,`EnableRaisingEvents`和`EventHandlers`的赋值必须在`Process.Start()`之后完成.否则它不会工作. (3认同)
  • @Doruk 我可以在调用 `Process.Start()` 之前设置 `EnableRaisingEvents=true`,它工作正常。 (2认同)

Cod*_*lla 28

来自MSDN:

退出事件表示相关进程已退出.这种情况意味着流程终止(中止)或成功关闭.仅当EnableRaisingEvents属性的值为true时,才会发生此事件.

您是否将该属性设置为true?

  • 这也是一个非常不具风格的旗帜(无论如何,如果我不想要这个活动,有什么用,我不赞成它!) (17认同)
  • 不是很直观.应该在每个事件描述中清楚地说明它需要设置此标志. (3认同)

Sam*_*m B 18

你必须设置Process.EnableRaisingEventstrue.


Ada*_*Cox 16

我遇到的例子那个地方new Process()一个在using条款。如果您想使用该Exited功能,请不要这样做。该using子句将销毁实例以及 上的任何事件句柄Exited

这个...

using(var process = new Process())
{
   // your logic here
}
Run Code Online (Sandbox Code Playgroud)

应该是这个...

var process = new Process();
Run Code Online (Sandbox Code Playgroud)


小智 14

设置correctionProcess.EnableRaisingEvents = true