【问题标题】:Calling executable using Process crashes intermittently使用进程调用可执行文件间歇性崩溃
【发布时间】:2008-12-09 19:53:05
【问题描述】:

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

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

我怀疑这次崩溃的原因是因为我写文件的方式。

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

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

这是调用的小sn-p:

  // 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);
          }
      }
  }

【问题讨论】:

  • 线程标签,但没有提到线程?
  • 您能否更具体地了解崩溃问题? (我同意 leppie 关于线程标签的观点)

标签: c# executable


【解决方案1】:

尝试在 tw.Write 之后添加刷新。这应该会导致产生故障点之前的完整输出,其中可能包括来自可执行文件的错误消息(如果这就是崩溃的原因?)

【讨论】:

  • 我在写入后添加了一个刷新,到目前为止,我已经有几天无法重现崩溃了。为什么要添加冲洗工作?
  • 尽管我很想以此为荣......我不知道。我对刷新的想法只是整个输出流可能没有显示,可能隐藏了一些有用的错误消息。
【解决方案2】:

您遇到的崩溃是什么? .Net 异常?

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-15
          • 1970-01-01
          • 2022-08-20
          • 2013-06-14
          • 2021-12-02
          • 1970-01-01
          • 1970-01-01
          • 2019-01-18
          相关资源
          最近更新 更多