Lassen Sie uns lesen, was MSDN darüber sagt: Die WaitForExit () () () - Überlastung wird verwendet, um den aktuellen Thread zu warten, bis der zugehörige Prozess beendet wird. Diese Methode weist die Prozesskomponente an, eine unendliche Zeit zu warten, bis der Prozess beendet wird. Dies kann dazu führen, dass eine Anwendung nicht mehr reagiert. Wenn Sie zum Beispiel CloseMainWindow für einen Prozess aufrufen, der über eine Benutzeroberfläche verfügt, wird die Anforderung des Betriebssystems, den zugeordneten Prozess zu beenden, möglicherweise nicht bearbeitet, wenn der Prozess geschrieben wird, um niemals in seine Nachrichtenschleife zu gelangen. Diese Überlastung stellt sicher, dass alle Verarbeitung abgeschlossen ist, einschließlich der Behandlung von asynchronen Ereignissen für umgeleitete Standardausgabe. Sie sollten diese Überladung nach einem Aufruf der WaitForExit (Int32) Überlast verwenden, wenn die Standardausgabe an asynchrone Ereignishandler umgeleitet wurde. Das ist natürlich für Was macht Sie denken, dass es nicht warten, bis die Note-Prozess zu beenden Was sind die Zeichen dafür, was ist der Beweis Freitag, 20. Februar 2009 20.13 Nicht sicher, ob dies geändert hat, aber vor kurzem wieder in den Tag Anwendungen auf dem Fenster Handy nie wirklich geschlossen, wenn Sie die X schließe sie zu schließen, würden sie nur minimieren und halten im Hintergrund laufen (dies war kein Fehler, es war ein Feature, seit dem nächsten Mal starten Sie die App würde es wirklich schnell gestartet werden, yah Ich weiß, wahnsinnig, aber wahr), so könnte das sein, warum WaitForExit ist vielleicht seltsam verhalten und warten auf App-Start anstelle von Exit. Aber dann wieder ist es nur Spekulation auf der Grundlage von Knowlegde von alten Versionen von Windows Mobile. Freitag, den 20. Februar 2009 um 11:03 Uhr Id mag diese Frage aufheben. Im auf Windows Mobile 6 Standard und ich versuche, eine Browser-Instanz zu erzeugen. Ich möchte warten, bis der Benutzer den Browser schließt. Aber WaitForExit kehrt extrem schnell zurück. Hier ist der Code: Process p new Process () p. StartInfo. Argumente quotexample-sitequot p. StartInfo. Verb quotOpenquot p. StartInfo. UseShellExecute false p. StartInfo. FileName quotIExplore. exequot p. Start () p. WaitForExit () MessageBox. Show ("Now der Browser sollte closedquot sein) Was sollte der richtige Weg, um die erwarteten Resuts erhalten werden, wenn das Symbol ist. Symbol. AlexB Dienstag, 09. Juni 2009 um 9:58 Uhr Im sehen das gleiche Problem, aber auf XP. Ich denke, der Beweis kann in jedem Debugger gesehen werden (wie ich sehe), oder in jeder Konsolenanwendung (nicht unbedingt auf Mobile) Mittwoch, 2. September 2009 08.35 Uhr Außer, dass Sie nicht erhalten dann ein Prozess-Objekt, das Sie können benutzen. MyProc. WaitForExit () Es wird immer noch sofort zurückgegeben, wenn Sie versuchen, Dim myProc als neuen Prozess () myProc Process. Start (quotiexplorequot, quotfinance. yahooqhpsquot Symbol) Mittwoch, September 02, 2009 8:48 PM Problem ist, dass du keine neue Instanz von iexplore. exe startet. Sie erstellen nur ein neues Fenster zum bestehenden Prozess. Meine Vermutung ist iexplore. exe startet, sieht eine vorherige Instanz und kommuniziert mit der vorherigen Instanz, so dass es öffnet sich das neue Fenster, und dann diese Instanz Sie begann sofort beendet. So ist das Verhalten richtig und zu erwarten. Blog. voidnish Mittwoch, September 02, 2009 8:52 PM Microsoft führt eine Online-Umfrage durch, um Ihre Meinung über die Msdn-Website zu verstehen. Wenn Sie sich für die Teilnahme entscheiden, wird Ihnen die Online-Umfrage präsentiert, wenn Sie die Msdn-Website verlassen. Möchten Sie teilnehmen? Ich versuche, einen Prozess zu starten und den StandardOutput und StandardError mit EventHandlers und BeginOutputReadLine zu packen. Ich kann den Prozess starten, aber ich bekomme Exception calling quotBeginOutputReadLinequot mit quot0quot Argument (s): quotCannot Mix synchronen und asynchronen Betrieb auf Prozess stream. quot Hier ist meine Startfunktion: ProcessStartInfo. FileName Global: Dateiname ProcessStartInfo. Arguments Global: Argumente ProcessStartInfo. UseShellExecute False ProcessStartInfo. RedirectStandardOutput true ProcessStartInfo. RedirectStandardError true Prozess System. Diagnostics. Process :: Start (ProcessStartInfo) Process. EnableRaisingEvents Process. addOutputDataReceived (Funktion: ReadOutput) Process. addErrorDataReceived (Funktion :: ReadError) StandardOutputStreamReader Process. StandardOutput StandardErrorStreamReader Process. StandardError Prozess. BeginOutputReadLine () lt-- Process. BeginErrorReadLine () lt-- Bin ich gegen die Powershell Threading Modell Danke Montag, 26. September 2011 16:32 Ich versuche, einen Prozess zu starten und greifen die StandardOutput und StandardError mit EventHandlers und BeginOutputReadLine . Ich kann den Prozess starten, aber ich bekomme Exception calling quotBeginOutputReadLinequot mit quot0quot Argument (s): quotCannot Mix synchrone und asynchrone Operation auf Prozess stream. quot Die Fehlermeldung ist teling Sie was Sie falsch machen Sie können keine Funktionen zu einem synchronen Prozess zuweisen. Die Funktionen sind keine Delegierten, also wird es nicht funktionieren. Sie müssen entweder ein Eventing-Modell verwenden oder die asynchische Variante verwenden. Verwenden Sie diese als Modell: Markiert als Antwort von Oliver Lipkau Moderator Mittwoch, 12. Oktober 2011 02:32 Ich versuche, einen Prozess zu starten und greifen die StandardOutput und StandardError mit EventHandlers und BeginOutputReadLine. Ich kann den Prozess starten, aber ich bekomme Exception calling quotBeginOutputReadLinequot mit quot0quot Argument (s): quotCannot Mix synchrone und asynchrone Operation auf Prozess stream. quot Die Fehlermeldung ist teling Sie was Sie falsch machen Sie können keine Funktionen zu einem synchronen Prozess zuweisen. Die Funktionen sind keine Delegierten, also wird es nicht funktionieren. Sie müssen entweder ein Eventing-Modell verwenden oder die asynchische Variante verwenden. Verwenden Sie dies als Modell: Als Antwort von Oliver Lipkau markiert Mittwoch, 12. Oktober 2011 02:32 Ok, ich habe die Umsetzung von BeginOutputReadline missverstanden. Ich dachte, das würde mit. WaitForExit arbeiten - es sieht jetzt an, ich sehe, warum es dosiert. In VB, ich weiß, wie zu 1) Spawn Threads, um dies zu behandeln und ich weiß, Sie können den Prozess ist in einer 2) Schleife, bis es fertig ist als ein Weg, um damit umzugehen. Ich möchte nicht zu tun 2. Gibt es eine Multithread-oder eine asynchrone Art und Weise zu lesen, die Ausgabe eines bestimmten Prozesses, wie der Prozess es erzeugt Dienstag, 27. September 2011 14:40 Ok, ich mißverstanden die Umsetzung von BeginOutputReadline. Ich dachte, das würde mit. WaitForExit arbeiten - es sieht jetzt an, ich sehe, warum es dosiert. In VB, ich weiß, wie zu 1) Spawn Threads, um dies zu behandeln und ich weiß, Sie können den Prozess ist in einer 2) Schleife, bis es fertig ist als ein Weg, um damit umzugehen. Ich möchte nicht tun 2. Gibt es eine multithreaded oder eine asynchrone Weise, die Ausgabe eines gegebenen Prozesses zu lesen, während der Prozess es erzeugt, nicht wirklich, wenn Sie einen Ereignisdelegierten verursachen möchten. Aber dann ist das PowerShell nicht VB. Sie können hier anfangen und sehen, ob die Veranstaltung, die Sie suchen, können Sie sich anzumelden Hilfe Register-ObjectEvent - full Bearbeitet von jrv Dienstag, 27. September 2011 15:22 Uhr Die markierte Antwort nicht Adresse Das Problem, mit dem das OP kämpft - nämlich die Umleitung von StdErr und StdOut und leidet unter dem hier diskutierten Deadlock-Bug: "Eine Deadlock-Bedingung kann resultieren, wenn der übergeordnete Prozess p. WaitForExit vor p. StandardOutput. ReadToEnd aufruft und der untergeordnete Prozess genug Text schreibt Um den umgeleiteten Stream zu füllen. Der übergeordnete Prozess würde auf unbestimmte Zeit warten, damit der Kindprozess beendet wird. Der Kind-Prozess würde auf unbestimmte Zeit für die Eltern warten, um aus dem vollständigen StandardOutput stream. quot Ich auch versuchen die beste Antwort für diese Arbeit in Powershell, aber alle Code-Beispiele, die ich laufe über diese Verwendung System. Diagnostics. Process in powersehll sind entweder Replikation der Deadlock in dieser Implementierung oder sind nicht Umleitung sowohl stderr und stdout. Die Lösung, mit der ich gehe, nutzt das Cmdlet Start-Process wie folgt: Es ist keine tolle Lösung, da es nur Stdout und Stderr in eine Textdatei umleiten wird. Aber es wird die ganze Zeit arbeiten und sowohl stdout als auch stderr umleiten. Donnerstag, Dezember 22, 2011 7:06 PM Wenn wir die umgeleitete Ausgabe verwenden, werden wir nicht warten. Das ist das Design von CreateProcess seit NT4. Die Verwendung von Dateien, um die Ausgabe zu erfassen, wird funktionieren, weil ein Stream anhängt, der eine konstante Lesung an den Ausgabestream platziert. Der Ausgabestrom wird nie aufgehängt Yu kann das nicht in einer Codeschleife machen. Der Stream laufen Sünde System Kontext Ich glaube und wird immer eine Chance zu lesen. Das Warten ist auf Sie Thread, so dass Sie nicht ein Handbuch lesen können. Es ist ein Deadlock wie angegeben. Der Gebrauch der Konsole gelesen ist allgemein, weil wir nach einer Aufforderung suchen. In diesem Fall würden wir niemals abwarten. ZTHe-Code wird wahrscheinlich ein Beendigung gesendet werden und wir werden den Prozeß überprüfen und drehen, bis es heruntergefahren ist. Das Problem hier ist, dass wir nicht ein Thead hervorbringen können. In VB oder C. C würden wir einfach separe Threads für IO und eins zum Warten verwenden. Besser noch würde ich ein Semaphor verwenden, da es dynamisch ein unerwartetes Herunterfahren fangen kann. Vielleicht wird die nächste Generation von PowerSHell gute Multithreading-Möglichkeiten haben. Donnerstag, 22. Dezember 2011 19:54 Dies ist nur eine Lektion, dass Powershell eine Skriptsprache ist, die keine Programmiersprache ist, und so mächtig wie es ist, gibt es Fallstricke. Der Beispielcode von Microsoft ist einfach nicht umfangreich genug für einen Powershell-Hack zu erkennen, dass sie nicht hierher kommen können. Dies ist, was mich gefangen und ich glaube das OP auch, denn es gab einige Expecectation, dass BeginOutputReadline implementiert die Magie machen es Arbeit Threads, die das Blocking Problem gelöst haben würde. Es ist nicht so, dass wir hier oben waren. Und eine leichte Korrektur zu meinem Code - ich verließ die - wait-Flagge, die für den Rest des Codes notwendig ist, um zu arbeiten: Donnerstag, 22. Dezember 2011 8:23 Dies ist nur eine Lektion, dass Powershell eine Skriptsprache ist Programmiersprache, und so mächtig wie es ist, gibt es Fallstricke. Der Beispielcode von Microsoft ist einfach nicht umfangreich genug für einen Powershell-Hack zu erkennen, dass sie nicht hierher kommen können. Dies ist, was mich gefangen und ich glaube das OP auch, denn es gab einige Expecectation, dass BeginOutputReadline implementiert die Magie machen es Arbeit Threads, die das Blocking Problem gelöst haben würde. Es ist nicht so, dass wir hier oben waren. Und eine leichte Korrektur zu meinem Code - ich verließ die - wait-Flagge, die für den Rest des Codes notwendig ist, um zu arbeiten: Richtig. PowerShell ist absichtlich begrenzt, um es sicherer für die allgemeine Bevölkerung und tto preent die Probleme, die mit kompilierten Sprachen auftreten. Ja - die Warteflagge würde helfen, da die Datei eventuell noch nicht abgespielt wurde, bevor das Programm heruntergefahren wird. Start-Prozess ist ein schwacher Wrapper auf der Prozess-API, aber es schützt das Ahnungslose von Deadlocks, weil man die Eingabe nicht aus einer Datei umleiten kann. Du brauchst nicht zu warten. Sie müssen es auf die Dateien warten und als eine einfache Möglichkeit, die Kündigung zu erkennen. Mit dem API muss dies durch Abfragen des Prozessobjekts oder durch Ausschießen der Ausgabe und Warten auf den Prozess erfolgen, um seine Terminierungsnachricht zu senden und dann den Status zu drehen. Das ist alles zu viel für admin scripters und, wie Sie darauf hingewiesen haben, werden sie in kein Ende der Schwierigkeiten bekommen. Donnerstag, 22. Dezember 2011 20:34 Hallo alle, ich habe viel gelesen und stolpern auf diesen Thread, ich habe erkannt, dass ich ein ähnliches Problem habe. Ich habe eine harte Zeit bekommen meine Ausgabe und meine Fehler-Feeds aus meinem ISE-Konsole-Fenster zu lesen. Auch nach dem Lesen alles, was oben geschrieben wurde und in die MSDN Hilfe Ort suchen, kann ich immer noch nicht sehen, die Fehler in meiner Art und Weise. Ich verstehe, dass man nicht sowohl asynchron als auch synchron zur gleichen Zeit lesen kann und dass, wenn man einen vor dem anderen nennt, werden sie sperren, aber ich kann immer noch nicht sehen, wo mein Fehler ist, weil ich überhaupt keine Ausgabe bekomme. Mein Code ist unten. Wenn irgendjemand von irgendwelchen großen Ressourcen auf dem Lernen von PowerShell dann lass es mich wissen, ich könnte verwenden, um ein wenig mehr zu lernen wissen. Nur ein Student der Technologie, die alle Montag, 29. Februar 2016 7:19 AM Sorry, aber dieses Thema wurde für 5 Jahre geschlossen. Du musst dein eigenes Thema anfangen. Montag, 29. Februar 2016 07:27 Hallo alle, ich habe viel gelesen und stolperte auf diesen Thread, ich erkannte, dass ich ein ähnliches Problem habe. Ich habe eine harte Zeit bekommen meine Ausgabe und meine Fehler-Feeds aus meinem ISE-Konsole-Fenster zu lesen. Auch nach dem Lesen alles, was oben geschrieben wurde und in die MSDN Hilfe Ort suchen, kann ich immer noch nicht sehen, die Fehler in meiner Art und Weise. Ich verstehe, dass man nicht sowohl asynchron als auch synchron zur gleichen Zeit lesen kann und dass, wenn man einen vor dem anderen nennt, werden sie sperren, aber ich kann immer noch nicht sehen, wo mein Fehler ist, weil ich überhaupt keine Ausgabe bekomme. Mein Code ist unten. Wenn irgendjemand von irgendwelchen großen Ressourcen auf dem Lernen von PowerShell dann lass es mich wissen, ich könnte verwenden, um ein wenig mehr zu lernen wissen. Nur ein Student der Technologie das ist alles Hallo, hast du die Lösung gefunden Ich habe das gleiche Problem :( Freitag, 02. Dezember 2016 2:33 PM Microsoft führt eine Online-Umfrage durch, um deine Meinung über die Website von Technet zu verstehen Zur Teilnahme wird Ihnen die Online-Umfrage vorgestellt, wenn Sie die Website von Technet verlassen. Möchten Sie 2017 Microsoft teilnehmen? Alle Rechte vorbehalten.
No comments:
Post a Comment