2017-05-04 3 views
0

Ich habe dies in einem BG Arbeiter DoWork()C# abbrechen einen externen Prozess gestartet von cmd.StandardOutput.ReadToEnd()

Process cmd = new Process(); 
cmd.StartInfo.FileName = "cmd.exe"; 
cmd.StartInfo.RedirectStandardInput = true; 
cmd.StartInfo.RedirectStandardOutput = true; 
cmd.StartInfo.RedirectStandardError = true; 
cmd.StartInfo.CreateNoWindow = true; 
cmd.StartInfo.UseShellExecute = false; 
cmd.Start(); 

string fullcmd = "\"" + doorsExe + "\" -osUser -b \"" + "doors_" + genname + ".dxl" + "\""; 

cmd.StandardInput.WriteLine(fullcmd); 
cmd.StandardInput.Flush(); 
cmd.StandardInput.Close(); 
cmd.WaitForExit(); 

string result; 

// HERE I WILL BECOME BLOCKED! 
if ((result = cmd.StandardOutput.ReadToEnd()) != string.Empty) 
    RaiseMessageEvent(result, Color.Gray); 

Jetzt habe ich das alles in

if (!bgwImport.CancellationPending) 
{ 
... 
} 

Aber natürlich , kann nicht abgebrochen werden, da es einen externen Prozess gibt, der alles blockiert. Es ist in Ordnung, da die Benutzeroberfläche nicht blockiert ist (deshalb habe ich BGW verwendet), aber ich habe eine "Abbrechen" -Schaltfläche implementiert, die nicht funktioniert.

Wie kann ich verhindern

cmd.StandardOutput.ReadToEnd() 

Vielen Dank im Voraus!

+1

Die Umstellung auf asynchrone Lesevorgänge von stderr/stdout kann Ihr Deadlock-Problem beheben. Ich habe eine einfache Version [hier] (http://stackoverflow.com/a/38491255/5095502) gemacht, die für mich funktioniert hat. Damit es wie Ihr Code funktioniert, ändern Sie einfach '(sender, args1) => Console.WriteLine (args1.Data);' um die Daten an eine Zeichenfolge anzufügen, dann wird diese Zeichenfolge am Ende der gleichen sein, wie Sie sie erwartet haben "Ergebnis" zu sein. – Quantic

+1

Beachten Sie auch, dass Sie uns ein [XY-Problem] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) gegeben haben, mein Kommentar oben ist, um Ihre 'tatsächliche' zu beheben Problem eines Deadlocks, eine Antwort auf Ihre Frage ist, ein Prozessobjekt an 'doorsExe' und [' Kill() '] anzuhängen (https://msdn.microsoft.com/en-us/library/system.diagnostics. process.kill (v = vs.110) .aspx) es. – Quantic

+0

Berücksichtigen Sie die Fehler im Code, bevor Sie nach der Vorschlaghammerlösung greifen. Es ist sehr wahrscheinlich, dass dieses Programm festgefahren ist, wenn Sie den Prozess erst beenden, bevor Sie mit dem Lesen der Ausgabe beginnen. –

Antwort

0

Ziemlich klar mit Sync/Async, danke für Hinweise. Jedoch bin ich bereits in einem Hintergrundarbeiter, so dass Async im Moment nicht wichtig ist.

Endlich irgendwie gelöst, für den Fall, dass jemand Haare aus dem Kopf zieht wie ich.

Danke für -1 auf jeden Fall, sehr ermutigend!

Wird in jedem Zustand abbrechen, habe ich in TaskManager eingecheckt, Türen funktioniert gut. Allerdings verbringe ich eine Stunde damit herauszufinden, wie umgeleitete Ausgabe ohne Erfolg erfasst werden kann. Immer NULL zurückgegeben. Ich gab einfach auf, ich muss nur diesen Prozess abbrechen.

  String command = "\"" + doorsExe + "\" -osUser -b doors_" + genname + ".dxl"; 
      ProcessStartInfo cmdsi = new ProcessStartInfo("cmd.exe", "/c" + command); 

      cmdsi.CreateNoWindow = true; 
      cmdsi.UseShellExecute = false; 

      Process cmd = new Process(); 
      cmd = Process.Start(cmdsi); 

      while (!cmd.HasExited) 
      { 

       if (bgwImport.CancellationPending) 
       { 
        e.Cancel = true; 
        return; 
       } 

      } 
Verwandte Themen