Waitforexit Deadlock
Ive lesen über diese Deadlock Bedingung, dass Im ziemlich sicher ist, dass mein Code (unten). Was ich nicht verstehe ist: Dieser Code funktionierte perfekt auf Windows Server 2003 (2.0) für die letzten 12 Jahre. Jetzt haben wir versucht, es auf Windows Server 2012 zu verschieben, wo es immer Deadlocks. Während meine DLLs für anyCPU (noch Targeting 2.0) gebaut werden, ist der ausführbare Prozess, der ausgeführt wird, absolut 32-Bit, und der Umzug von Server 2003 zu Server 2012 geht von einem 32-Bit - auf 64-Bit-Betriebssystem. Ich glaube, ich verstehe, was zu tun, um das Problem zu lösen, aber weiß jemand, warum dieses Verhalten von Server 2003 auf Server geändert werden 2012 Mystery Deadlock noch existiert, auch nach dem Ändern der oben genannten Code wie empfohlen: Welche anderen Bedingungen könnte dazu führen, dass Deadlock Wenn Ich sollte StandardError untersuchen, würde es irgendetwas nützliches FWIW zeigen, haben wir einen anderen Windows Server 2003 (32-Bit) bereitgestellt, der IIS 6 ausführt. Das war die ursprüngliche Maschinenkonfiguration dieser Code lief für 12 Jahre (mit nur einem gelegentlichen Deadlock ). Der gleiche Code, dass Deadlocks auf Server 2012 IIS 8 nicht auf diesem Server 2003 DEADLOCK. Wir haben jetzt unsere eigenen minimalen und vollständigen Code, der das Problem reproduziert. Allerdings ist die. exe weve lizenziert, die durch den Prozess ausgeführt wird, hat Vertraulichkeit Klauseln, die uns von der Entsendung zu verhindern. Ich weiß, dass das hilft den Experten hier nicht. Die ONE HINT Weve begegnet ist, dass beim Ausführen über die Visual Studio 2013 Debugger auf dem eigentlichen Server installiert ist, wird der Prozess nicht deadlockhang, während das Aufrufen des Prozesses von einem Browser OUTSIDE der Server tut. Und seltsam - von einem Browser auf dem 2012 SERVER können wir nicht mit dieser Testseite verbinden - der Browser sagt einfach an die Verbindung und irgendwann mal aus (aber auch andere Seiten, die von demselben Server gehostet werden, IIS 8 kann aus einem Browser auf der Server) Da die gleichen Befehlszeilenparameter manuell von einer Admin-Befehls-Shell oder einer Nicht-Admin-Befehls-Shell ausgeführt werden, funktioniert das einwandfrei, es ist schwer zu glauben, dass es ein 64-Bit-WOW64-Problem mit dieser 32-Bit-ausführbaren Datei oder den erforderlichen DLLs gibt. Wir suchen weiterhin nach Orten, an denen unsere Berechtigungen Probleme verursachen können (der Prozess muss in einen temporären Ordner schreiben, der bei c: temp für jetzt platziert wird). Ich habe ein paar verschiedene SO-Antworten, die bei der Beantwortung von Fragen anders als die, die Sie hier haben, Beispiele für die Umleitung von StandardOutput und StandardError ohne Deadlocking des Codes. Vielleicht finden Sie eine oder mehrere von ihnen nützlich: stackoverflowa33508142. Stackoverflowa26722542 Und stackoverflowa38881345 ndash Peter Duniho Sep 5 16 bei 23: 10Elina: Danke für deine Antwort. Es gibt einige Notizen am unteren Rand dieses MSDN-Dokuments (msdn. microsoften-uslibraryhellip), die über potenzielle Deadlocks warnen, wenn Sie bis zum Ende der beiden umgeleiteten Stdout - und Stderr-Ströme synchron lesen. Es ist schwer zu sagen, ob Ihre Lösung anfällig für dieses Problem ist. Außerdem scheint es, dass du die process39 stdoutstderr Ausgabe direkt als Eingang sendest. Warum. ) Ndash Matthew Piatt Sep 26 16 at 4:42 Dies ist eine modernere, aufwartende, Task Parallel Library (TPL) basierte Lösung für 4.5 und höher. Usage Beispiel Implementierung beantwortet 5. Oktober 16 um 10:54 Ich Ding, dass dies ist einfach und besser Ansatz (wir brauchen nicht AutoResetEvent) Antwort # 2 am: Mai 18, 2010, 07:13:13 am »True, aber shouldn39t Sie tun. FileName Pfad quotggsci. exequot quot lt Obeycommand. txtquot, um Ihren Code zu vereinfachen oder vielleicht etwas gleichbedeutend mit quotecho Befehl path quotggsci. exequot wenn Sie wirklich don39t wollen eine separate obeycommand. txt Datei verwenden. Ndash Amit Naidu Jun 3 13 at 22:03 Deine Lösung braucht nicht AutoResetEvent, aber du zählst. Wenn du anstelle von Event-Event (wenn sie verfügbar sind), dann sind Sie mit CPU ohne Grund und das deuten darauf hin, dass Sie ein schlechter Programmierer sind. Ihre Lösung ist wirklich schlecht, wenn mit dem anderen mit AutoResetEvent verglichen. (Aber ich habe dir nicht gegeben, weil du versucht hast zu helfen). Ndash Eric Ouellet Nov 7 14 at 18:38 Ich hatte das gleiche Problem, aber der Grund war anders. Es würde aber unter Windows 8 passieren, aber nicht unter Windows 7. Die folgende Zeile scheint das Problem verursacht zu haben. Die Lösung bestand darin, UseShellExecute NICHT zu deaktivieren. Ich habe jetzt ein Shell Popup-Fenster, das ist unerwünscht, aber viel besser als das Programm wartet auf nichts Besonderes passieren. So fügte ich das folgende Work-around hinzu: Jetzt das einzige, was mich stört, ist, warum dies geschieht unter Windows 8 an erster Stelle. Antwortete 13. Januar 15 um 10:35 Ich habe versucht, eine Klasse, die Ihr Problem mit asynchronen Stream zu lösen, zu lesen, indem Sie in Rechnung Mark Byers, Rob, stevejay Antworten zu machen. So erkannte ich, dass es einen Fehler gibt, der mit dem asynchronen Prozessausgangsstrom verknüpft ist. Du kannst das nicht tun: Du erhältst System. InvalidOperationException. StandardOut wurde nicht umgeleitet oder der Prozess hat noch nicht begonnen. Dann müssen Sie die asynchrone Ausgabe starten, nachdem der Prozess gestartet wurde: So machen Sie eine Racebedingung, da der Ausgabestream Daten empfangen kann, bevor Sie ihn auf asynchron einstellen: Dann könnten einige Leute sagen, dass Sie nur den Stream vor Ihnen lesen müssen Setze es asynchron an. Aber das gleiche Problem tritt auf. Es wird eine Race-Bedingung zwischen dem synchronen Lesen und setzen den Stream in den asynchronen Modus. Es gibt keinen Weg, um sicheres asynchrones Lesen eines Ausgabestreams eines Prozesses in der tatsächlichen Weise zu bewirken, dass Process und ProcessStartInfo entworfen wurden. Sie sind wahrscheinlich besser mit asynchronen lesen wie vorgeschlagen von anderen Benutzern für Ihren Fall. Aber Sie sollten sich bewusst sein, dass Sie aufgrund der Rennbedingung einige Informationen verpassen könnten.
Comments
Post a Comment