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!
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
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
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. –