2

C# で実行可能ファイルを呼び出しています。実行可能ファイルが実行されると、コンソールに出力されるため、C# コードはコンソール出力を取得してテキスト ファイルに書き込みます。クラッシュが発生すると、いくつかのことが起こります。

1) テキスト ファイルの出力が完全に書き出されていません。2) 実行が成功した場合と同じようにレポートが生成されるため、実行可能プロセスは完全に実行されているように見えます。

このクラッシュの原因は、ファイルの書き方にあると思われます。

更新: - クラッシュに関する限り、「Manager で問題が発生したため、閉じる必要があります。ご迷惑をおかけして申し訳ありません」というダイアログが表示されます。次に、OKボタンがあります。[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);
          }
      }
  }
4

5 に答える 5

1

クラッシュしているプロセスにデバッガーを接続すると、クラッシュした理由が正確にわかります。クラッシュのデバッグに関する詳細なチュートリアルは次のとおりです

于 2008-12-10T04:11:55.077 に答える
1

tw.Write の後にフラッシュを追加してみてください。これにより、障害が発生した時点までの完全な出力が生成されます。これには、実行可能ファイルからのエラー メッセージが含まれる場合があります (それが原因でクラッシュしている場合は?)。

于 2008-12-09T22:27:39.937 に答える
1

それはおそらくあなたのハンドラーにあります。ストリーム ハンドラーによってスローされた例外を処理するロジックを配置する必要があります。また、プロセスで close を呼び出す前に、ストリーム ハンドラーが適切に閉じられていることを確認するメカニズムを配置する必要があります。このような問題は、イベント ハンドラーと process.close のタイミングの問題により突き止めるのが難しいため、他の投稿者がそれを再現できなかったことに驚かないでください。しかし、私は実際にそれを見てきました。問題は、cancelErrorRead または cancelOutputRead を呼び出して閉じるか、プロセスが終了するまで EventHandler がアクティブであることです。まあ、メインスレッドが Process.Close...BOOM に到達している間に、プロセスの最後から出力をフラッシュするのにまだ忙しい場合

于 2008-12-10T13:26:16.113 に答える
1

あなたが得ているクラッシュは何ですか?.Net 例外?

ファイルが完全に書き込まれていないのは、ストリームをファイルにフラッシュしてから閉じていないことが原因である可能性があります。

標準出力メッセージとエラー出力メッセージの両方に同じストリームを使用すると問題になる可能性があると思います。これにより、同時実行の問題が発生する可能性があります。

于 2008-12-09T20:05:10.193 に答える
0

あなたのコードをさまざまな実行可能ファイルでテストしましたが、あなたが説明した方法でコードをクラッシュさせることはできませんでした。実行しているプロセスに問題があるのではないでしょうか?

于 2008-12-09T22:38:42.770 に答える