Aufrufen ausführbarer Verwendung Prozess abstürzt intermittierend

stimmen
2

Ich bin eine ausführbare Datei in C # aufrufen. Wenn das Programm läuft, schreibt sie an die Konsole aus, so dass das C # -Code wird die Konsolenausgabe bekommen und es in eine Textdatei zu schreiben. Wenn der Absturz ein paar Dinge passiert, auftreten.

1) Die Ausgabe der Textdatei wird nicht vollständig ausgeschrieben. 2) Der ausführbare Prozess scheint vollständig durch laufen, weil es wie ein erfolgreicher Lauf einen Bericht erzeugt.

Ich vermute, dass der Grund für diesen Absturz ist, weil, wie ich schreibe die Datei aus.

Update: - Was den Crash, kommt ein Dialog sagen, bis dass der „-Manager ein Problem festgestellt und muss beendet werden Wir entschuldigen uns für die Unannehmlichkeiten..“ Dann hat es eine OK-Taste. Wenn Sie auf OK klicken, gibt es einen Dialog, den ich Setup haben, wenn ich wieder den Manager gestartet werden soll, fragt.

  • Die Manager-Anwendung, die die ausführbare Datei aufruft ist single threaded. Die ausführbare Datei kann laufen multi-threaded.

Hier ein kleiner Ausschnitt aus dem Gespräch:

  // 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);
          }
      }
  }
Veröffentlicht am 09/12/2008 um 20:53
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
1

Es ist wahrscheinlich in Ihrem Handler. Sie sollten in der Logik setzen, um Ausnahmen von den Stream-Handler geworfen handhaben und Sie sollten in einem Mechanismus setzen, um sicherzustellen, dass die Strom-Handler richtig geschlossen werden, bevor Sie auf dem Prozess der Nähe nennen. Probleme wie diese sind schwer wegen der Timing-Probleme mit den Event-Handler zu und der process.close so ist es mir andere Plakate haben es nicht reproduzieren konnten überraschen tut. Aber ich habe es in Aktion zu sehen. Das Problem ist der Eventhandler aktiv ist, bis sie durch den Aufruf cancelErrorRead oder cancelOutputRead oder den Prozess beendet ist geschlossen. Nun, wenn es immer noch damit beschäftigt ist, eine Ausgabe von dem Ende des Prozesses gespült, während der Haupt-Thread macht es Process.Close ... BOOM

Beantwortet am 10/12/2008 um 14:26
quelle vom benutzer

stimmen
1

Wenn Sie einen Debugger an den Abstürzen Prozess anhängen, werden Sie genau wissen , warum es abgestürzt ist . Hier ist eine detaillierte Anleitung zum Debuggen stürzt ab: http://blogs.msdn.com/kirillosenkov/archive/2008/12/07/how-to-debug-crashes-and-hangs.aspx

Beantwortet am 10/12/2008 um 05:11
quelle vom benutzer

stimmen
1

Versuchen Sie, einen Flush nach dem tw.Write Zugabe. Das sollte die komplette Ausgabe bis zu dem Zeitpunkt des Fehlers bewirken, hergestellt werden, die Fehlermeldungen aus dem ausführbaren umfassen kann (wenn das, was abstürzt?)

Beantwortet am 09/12/2008 um 23:27
quelle vom benutzer

stimmen
1

Was ist der Absturz, die Sie bekommen? Eine .NET-Ausnahme?

Dass die Datei nicht vollständig kann geschrieben werden, weil Sie nicht den Strom in die Datei spülen und schließen Sie es dann.

Ich denke, es könnte ein Problem sein, dass Sie den gleichen Strom sowohl für Standard verwenden und Fehler aus Nachrichten. Dies könnte zu Problemen führen Gleichzeitigkeit.

Beantwortet am 09/12/2008 um 21:05
quelle vom benutzer

stimmen
0

Ich habe Ihren Code mit einer Reihe von verschiedenen ausführbaren Dateien getestet und war nicht in der Lage, um es den Weg zum Absturz bringen Sie beschreiben. Vielleicht ist es ein Problem mit dem Prozess Sie ausführen?

Beantwortet am 09/12/2008 um 23:38
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more