使用Process调用可执行文件会间歇性地崩溃

时间:2008-12-09 19:53:06

标签: c# executable

我在C#中调用可执行文件。当可执行文件运行时,它会写入控制台,因此C#代码将获取控制台输出并将其写入文本文件。当崩溃发生时会发生一些事情。

1)文本文件的输出未完全写出。 2)可执行进程似乎完全运行,因为它生成报告就像成功运行一样。

我怀疑这次崩溃的原因是因为我正在编写文件。

更新: - 至于崩溃,会出现一个对话框,说“经理遇到了问题,需要关闭。我们很抱歉给您带来不便。”然后它有一个OK按钮。当您单击“确定”时,会出现一个我已设置的对话框,询问我是否要再次启动管理器。

  • 调用可执行文件的管理器应用程序是单线程的。可执行文件可以运行多线程。

这是一个小小的电话片段:

  // Set up process to redirect standard output and standard error to
  // a file.
     process.StartInfo.UseShellExecute = false;
     process.StartInfo.RedirectStandardOutput = true;
     process.StartInfo.RedirectStandardError = true;
     FileInfo ofi = new FileInfo(outputPath);
     FileStream ofs = ofi.OpenWrite();
     StreamWriter sw = new StreamWriter(ofs);
     WriteToTextWriterEventHandler wtsweh = new WriteToTextWriterEventHandler(sw);
     DataReceivedEventHandler handler = wtsweh.HandleDataReceived;
     process.OutputDataReceived += handler;
     process.ErrorDataReceived += handler;
     //

     statusAcceptor.ReportStatus("Running process.");
     process.Start();
     process.BeginOutputReadLine();
     process.BeginErrorReadLine();

     statusAcceptor.ReportStatus("Waiting for process to complete.");
     process.WaitForExit();
     int processExitCode = process.ExitCode;
     process.Close();
     sw.Close();


  // 
  private class WriteToTextWriterEventHandler
  {
      private TextWriter tw;

      public WriteToTextWriterEventHandler(TextWriter tw)
      {
          this.tw = tw;
      }

      public void HandleDataReceived(object sendingProcess,
         DataReceivedEventArgs outLine)
      {
          // Collect the sort command output.
          if (!String.IsNullOrEmpty(outLine.Data))
          {
              tw.Write(Environment.NewLine + outLine.Data);
          }
      }
  }

5 个答案:

答案 0 :(得分:1)

你得到的崩溃是什么? .Net例外?

文件未完全写入可能是因为您没有将流刷新到文件中然后将其关闭。

我认为对标准输出和错误输出消息使用相同的流可能是一个问题。这可能会导致并发问题。

答案 1 :(得分:1)

尝试在tw.Write之后添加flush。这应该导致完整输出直到生成失败点,这可能包括来自可执行文件的错误消息(如果那是崩溃的原因?)

答案 2 :(得分:1)

如果您将调试程序附加到崩溃进程,您将确切地知道它崩溃的原因。 这是一个关于调试崩溃的详细教程: http://blogs.msdn.com/kirillosenkov/archive/2008/12/07/how-to-debug-crashes-and-hangs.aspx

答案 3 :(得分:1)

可能在您的处理程序中。您应该输入逻辑来处理流处理程序抛出的异常,并且您应该设置一个机制来确保在调用进程关闭之前正确关闭流处理程序。这样的问题很难确定,因为事件处理程序和process.close的时间问题所以它并不让我感到惊讶,其他海报也无法重现它。但我已经看到它在行动。问题是EventHandler处于活动状态,直到通过调用cancelErrorRead或cancelOutputRead关闭它或进程退出。好吧,如果它仍然忙于从进程的最后部分刷新一些输出,而主线程使它成为Process.Close ... BOOM

答案 4 :(得分:0)

我已经使用许多不同的可执行文件测试了您的代码,并且无法按照您描述的方式使其崩溃。也许这是您正在执行的流程的问题?