从Process.Exited处理程序中抛出异常

时间:2009-05-29 15:42:12

标签: c# exception synchronization process

我有一个运行外部命令行实用程序并读取标准输出(PNG图像)的程序。最初在测试期间,我让命令行程序将图像写入临时文件,然后将文件加载到该程序。我有一个Process.Exited的处理程序,如果退出代码非零,则会抛出异常。我在加载临时映像之前调用了WaitForExit以确保进程完成。如果引发异常,则会在读取临时映像文件的代码中处理该异常。现在,我调用Process.Start直接创建图像文件,如果没有错误,它可以正常工作。如果外部程序异常退出,则退出处理程序抛出的异常不再被我的代码捕获。如果我在读取标准输出之前调用WaitForExit,程序将挂起。有没有办法在不调用WaitForExit的情况下捕获退出处理程序抛出的异常?

2 个答案:

答案 0 :(得分:0)

听起来像命令行实用程序没有正常退出。您是否通过显示进程窗口来检查它是否正在执行某些不正确的操作?

我的第二个赌注是不读取标准输出导致程序不退出(它等待能够清除它的输出),因此您必须首先读取标准输出,然后等待实用程序停止

答案 1 :(得分:0)

Process.Exited处理程序在上下文中执行,该上下文与启动进程的函数分开。你可以用两种方法解决这个问题。

  1. 启动流程后写一个循环。 (使用进程'句柄,在循环中调用WaitOne(100)。如果你得到异常,句柄就会消失,你应该像进程一样完成。如果你没有得到异常,结果为true表示该过程已经关闭。)
  2. 在开始进程之前创建一个ResetResetEvent,您可以重置()。启动该过程后,在该事件上调用WaitOne()。在Process.Exited处理程序中,Set()该事件,然后main方法将继续。