Danke für deinen Beitrag. Soweit ich weiß, kann es zu einem Deadlock führen. Eine Deadlock-Bedingung ergibt sich, wenn der übergeordnete Prozess p. StandardOutput. ReadToEnd gefolgt von p. StandardError. ReadToEnd und der untergeordnete Prozess schreibt genug Text, um seinen Fehlerstrom zu füllen. Der übergeordnete Prozess würde auf unbestimmte Zeit warten, damit der Kindprozess seinen StandardOutput-Stream schließt. Der untergeordnete Prozess würde auf unbestimmte Zeit warten, damit der Elternteil aus dem vollständigen StandardError-Stream gelesen wird. Sie können asynchrone Leseoperationen verwenden, um diese Abhängigkeiten und ihr Deadlock-Potential zu vermeiden. Alternativ können Sie die Deadlock-Bedingung vermeiden, indem Sie zwei Threads erstellen und die Ausgabe jedes Streams auf einem separaten Thread lesen. Führen Sie keine synchrone Ablesung bis zum Ende der beiden String-Ausgabe aus p. StandardOutput. ReadToEnd () String-Fehler p. StandardError. ReadToEnd () Verwenden Sie asynchrone Leseoperationen auf mindestens einem der Streams. String-Fehler p. StandardError. ReadToEnd () Für weitere Informationen, überprüfen Sie bitte den folgenden Link Hope meine Antwort hilft. Ziwei Chen MSFT MSDN Community Support Feedback zu uns Get oder Anfrage Code Beispiel von Microsoft Bitte denken Sie daran, die Antworten als Antworten zu markieren, wenn sie helfen und sie aufheben, wenn sie keine Hilfe leisten. Als Antwort von Nabil Shaik markiert Mittwoch, 25. März 2011 um 11:18 Uhr Das ist so etwas wie dieses: MSBuildPath CSProjFilePath T: Paket P: ConfigurationDebugPackageLocationLocationPathFileName. Zip MSBuildPath - ist der Pfad der MSBuild. Exe wie c: Program FilesVisual Studio 10.0Common7IDEMSBuild. exe LocationPathFileName. Zip - wo der Build gebaut werden muss - wie zB c: MyBuildLocationMyFile. Zip Dieser Befehl ist alles gut. Wenn ich es mit VS Command prompt ausführen, funktioniert es gut. Es funktioniert auch gut, solange ich nicht mit StandardError und StandardOutput umgehen muss. Der Grund, warum ich nicht auf StandardError und StandardOutput übersehen kann, ist, weil sie diejenigen sind, die ein Ergebnis geben - wie zum Beispiel zu wissen, ob Build erfolgreich gemacht wurde oder es hat einige Fehler gegeben. Donnerstag, 24. März 2011 16:45 Vielen Dank für Ihren Beitrag. Soweit ich weiß, kann es zu einem Deadlock führen. Eine Deadlock-Bedingung ergibt sich, wenn der übergeordnete Prozess p. StandardOutput. ReadToEnd gefolgt von p. StandardError. ReadToEnd und der untergeordnete Prozess schreibt genug Text, um seinen Fehlerstrom zu füllen. Der übergeordnete Prozess würde auf unbestimmte Zeit warten, damit der Kindprozess seinen StandardOutput-Stream schließt. Der untergeordnete Prozess würde auf unbestimmte Zeit warten, damit der Elternteil aus dem vollständigen StandardError-Stream gelesen wird. Sie können asynchrone Leseoperationen verwenden, um diese Abhängigkeiten und ihr Deadlock-Potential zu vermeiden. Alternativ können Sie die Deadlock-Bedingung vermeiden, indem Sie zwei Threads erstellen und die Ausgabe jedes Streams auf einem separaten Thread lesen. Führen Sie keine synchrone Ablesung bis zum Ende der beiden String-Ausgabe aus p. StandardOutput. ReadToEnd () String-Fehler p. StandardError. ReadToEnd () Verwenden Sie asynchrone Leseoperationen auf mindestens einem der Streams. String-Fehler p. StandardError. ReadToEnd () Für weitere Informationen, überprüfen Sie bitte den folgenden Link Hope meine Antwort hilft. Ziwei Chen MSFT MSDN Community Support Feedback zu uns Get oder Anfrage Code Beispiel von Microsoft Bitte denken Sie daran, die Antworten als Antworten zu markieren, wenn sie helfen und sie aufheben, wenn sie keine Hilfe leisten. Als Antwort von Nabil Shaik markiert Mittwoch, 30. März 2011 11:18 Uhr Freitag, 25. März 2011 05:57 Larcolais Gong - Vielen Dank für das Verschieben des Threads. Danke für Ihre Antwort. Ich las es am anderen Tag, dass Deadlock war der Grund für den Prozess hängen und Sie haben mir klar, dass der Blog richtig war. Ich möchte, dass Sie Sie bitten, ein bisschen mehr zu verraten, wie der Deadlock auftritt, wenn Sie können. Ich bin mir nicht sicher, wie es passieren könnte, da meine MSBuild keine Fehler oder Warnungen warf, als ich das Projekt baute. Ich könnte versuchen, einen Fall darzustellen, wo es ausgegeben worden wäre, dann ein Fehler, dann wieder und Ausgabe und dann ein Fehler (ein zyklisches Muster), wo es eine Chance für beide Streams gibt, einen Deadlock zu verursachen - aber hier, bei In einigen Fällen hatte ich noch keine Fehler oder Warnungen mit meinem Build. Ich habe Fälle gehabt, als dieser Vorgang fehlte, ohne zu hängen - aber gut, ich glaube, ich kann verstehen, dass Deadlock nicht immer die ganze Zeit passieren muss, und es passiert einfach zufällig, wann immer es auf unlösbare Ressourcen wartet. Auf den Code gegeben, konnte ich die Methode nicht finden. Ist es möglich, dass man mich wissen lassen könnte, wie man das asynchrone Lesen tut. Außerdem ist das Hauptproblem das, wenn ich String errorMessage p. StandardError. ReadToEnd () hat. Es kommt zu einem Deadlock. Wo, als ob ich die Zeile p. RedirectStandardOuputtrue kommentiere, dann geht es gut. Aber dann wieder, wenn ich die Zeile kommentiere und die Fehlermeldungen angezeigt hast, dann bekomme ich es wie: Der Handle ist ungültig Der Handle ist ungültig Der Handle ist ungültig Der Handle ist ungültig Der Handle ist ungültig Um loszuwerden Diese Griff ist ungültige Nachrichten, ich ermöglichte die RealirectStandardOutput true Eigenschaft. Kannst du mich bitte leiten. System. Diagnostics. Process. WaitForExit Methode Weist die Prozesskomponente an, die angegebene Anzahl von Millisekunden zu warten, damit der zugehörige Prozess beendet wird. Parameter milliseconds Die Zeitdauer in Millisekunden, um zu warten, dass der zugehörige Prozess beendet wird. Das Maximum ist der größtmögliche Wert einer 32-Bit-Ganzzahl, die Unendlichkeit für das Betriebssystem darstellt. True, wenn der zugehörige Prozess anders verlässt, false. Die Process. WaitForExit (Int32) Überladung wird verwendet, um den aktuellen Thread zu warten, bis der zugehörige Prozess beendet wird. Diese Überlastung weist die Prozesskomponente an, eine endliche Zeit zu warten, bis der Prozess beendet wird. Wenn der zugehörige Prozess nicht am Ende des Intervalls beendet wird, da die Anforderung zum Beenden verweigert wird, wird false an die aufrufende Prozedur zurückgegeben. Sie können eine negative Zahl (Timeout. Infinite) für Millisekunden angeben. Und Process. WaitForExit (Int32) verhält sich genauso wie die Process. WaitForExit-Überladung. Wenn du 0 (null) an die Methode übergibst, gibt es nur dann true zurück, wenn der Prozess bereits ausgegeben hat, gibt er sofort false zurück. In den netv35long und früheren Versionen, wenn Millisekunden -1 war, wartete die Process. WaitForExit (Int32) Überladung auf Int32.MaxValue Millisekunden (ca. 24 Tage), nicht auf unbestimmte Zeit. Wenn die Standardausgabe an asynchrone Ereignishandler umgeleitet wurde, ist es möglich, dass die Ausgabeverarbeitung nicht abgeschlossen ist, wenn diese Methode zurückgegeben wird. Um sicherzustellen, dass die asynchrone Ereignisbehandlung abgeschlossen ist, rufen Sie die Process. WaitForExit-Überladung auf, die nach dem Erhalt eines true aus dieser Überladung keinen Parameter annimmt. Um sicherzustellen, dass das Process. Exited-Ereignis in Windows Forms-Anwendungen korrekt behandelt wird, legen Sie die Process. SynchronizingObject-Eigenschaft fest. Wenn ein zugehöriger Prozess beendet wird (wird durch das Betriebssystem durch eine normale oder abnormale Beendigung heruntergefahren), speichert das System administrative Informationen über den Prozess und kehrt zu der Komponente zurück, die Process. WaitForExit (Int32) aufgerufen hat. Die Prozesskomponente kann dann auf die Informationen zugreifen, die die Process. ExitTime enthalten. Indem du den Process. Handle zum ausgehenden Prozess verwende. Da der zugehörige Prozess beendet ist, weist die Process. Handle-Eigenschaft der Komponente nicht mehr auf eine vorhandene Prozessressource hin. Stattdessen kann der Handgriff nur verwendet werden, um auf die Betriebssysteme Informationen über die Prozessressource zuzugreifen. Das System ist sich bewusst, dass Handles zu ausgehenden Prozessen aufgeführt sind, die nicht von Prozesskomponenten freigegeben wurden, so dass es die Process. ExitTime - und Process. Handle-Informationen im Speicher hält, bis die Process-Komponente die Ressourcen speziell freigibt. Aus diesem Grund, wenn Sie Process. Start für eine Process-Instanz aufrufen, rufen Sie Process. Close auf, wenn der zugehörige Prozess beendet ist und Sie keine Verwaltungsinformationen mehr benötigen. Process. Close befreit den Speicher, der dem ausgegebenen Prozess zugeordnet ist. Requirements Namespace: System. Diagnostics Assembly: System (in System. dll) Assembly Versionen: 1.0.5000.0, 2.0.0.0, 4.0.0.0
No comments:
Post a Comment