Saturday 6 May 2017

Waitforexit Prozess C 41


Lets lesen, was MSDN darüber sagt: Die WaitForExit () () () Überlast 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 anrufen, der über eine Benutzeroberfläche verfügt, wird die Anforderung an das Betriebssystem, den zugehörigen Prozess zu beenden, möglicherweise nicht behandelt, wenn der Prozess geschrieben wird, um seine Nachrichtenschleife niemals einzugeben. Diese Überlastung stellt sicher, dass alle Bearbeitungen abgeschlossen sind, einschließlich der Handhabung von asynchronen Ereignissen für umgeleiteten Standardausgang. 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 8:13 PM Nicht sicher, ob dies hat sich vor kurzem geändert, aber wieder in den Tag Anwendungen auf Fenster Mobile nie wirklich geschlossen, wenn Sie die X schlagen, um sie zu schließen, würden sie nur minimieren und weiterlaufen im Hintergrund (das war kein Bug, 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), also könnte das sein, warum WaitForExit sich vielleicht seltsam verhält und auf App-Start statt Ausfahrt wartet. 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: Prozess p neue Prozess () p. StartInfo. Argumente quotexample-sitequot p. StartInfo. Verb quotOpenquot p. StartInfo. UseShellExecute false p. StartInfo. FileName quotIExplore. exequot p. Start () p. WaitForExit () MessageBox. Show ("Nein, der Browser sollte geschlossen sein) Was sollte der richtige Weg sein, um die erwarteten Resuts zu bekommen Montag, 08. Juni 2009 10:45 Uhr Wo 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 irgendeiner Konsolenanwendung (nicht unbedingt auf Mobile) Mittwoch, September 02, 2009 8:35 PM Außer, dass Sie nicht dann ein Prozessobjekt bekommen, das Sie können benutzen. Wenn Sie versuchen, Dim MyProc Als neuer Prozess () myProc Process. Start (quotiexplorequot, quotfinance. yahooqhpsquot Symbol) myProc. WaitForExit () Es kommt immer noch sofort zurück. Mittwoch, September 02, 2009 8:48 PM Problem ist, dass du keine neue Instanz von iexplore. exe startet. Sie erstellen einfach ein neues Fenster auf dem bestehenden Prozess. Meine Vermutung ist iexplore. exe beginnt, sieht eine vorherige Instanz und kommuniziert mit der vorherigen Instanz, so dass es das neue Fenster öffnet, und dann diese Instanz, die Sie begonnen Exits sofort. Also 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 eine Teilnahme entscheiden, wird Ihnen die Online-Umfrage vorgestellt, wenn Sie die Msdn-Website verlassen. Möchten Sie teilnehmen Der Code sieht fast so aus: Wie Sie sehen können, startet der Code einen cmd. exe Prozess und übergibt ihm den Befehl, den ich ausgeführt werden möchte. Ich leite standardError und StandarOutput um, um sie aus dem Code zu lesen. Der Code liest sie vor dem Prozess. WaitForExit (Timeout) Aufruf, wie von Microsoft empfohlen (mehr dazu später). Das Problem entsteht, wenn der Befehl, den ich an cmd. exe sendet, niemals endet oder hängt unendlich. In dem Code habe ich den Befehl ping - t 8.8.8.8 verwendet, der wegen der Option - t den Host ohne Stopp pingt. Was passiert Der cmd. exe Prozess zusammen mit dem ping - t Befehl nie beendet und nie schließt den Stdout-Stream und so unser Code hängt an der Ausgabe process. StandardOutput. ReadToEnd () Zeile, weil es nicht erfolgreich sein kann, den gesamten Stream zu lesen. Das gleiche passiert auch, wenn ein Befehl in einer Batch-Datei aus irgendeinem Grund hängt und so kann der obige Code kontinuierlich für Jahre arbeiten und dann plötzlich ohne offensichtlichen Grund hängen. Bevor ich schrieb, dass es empfohlen ist, umgeleitete Ströme vor dem Prozess zu lesen. WaitForExit (Timeout) Aufruf, das gilt besonders, wenn Sie die WaitForExit Signatur ohne Timeout verwenden. Wenn Sie Prozess anrufen. WaitForExit () vor dem Lesen der umgeleiteten Streams: Code 2: Sie können einen Deadlock erleben, wenn der Befehl, den Sie an cmd. exe anhängen oder der Prozess, den Sie anrufen, die Standardausgabe oder den Standardfehler füllt. Dies, weil unser Code kann nicht erreichen die Linien Ausgabe Prozess. StandardOutput. ReadToEnd () In der Tat ist das Kind-Prozess (der Ping-Befehl oder eine Batch-Datei oder was auch immer Prozess, den Sie ausführen) kann nicht weitergehen, wenn unser Programm nicht die gefüllten Puffer der Streams liest und das kann nicht passieren, weil der Code hängt Die Linie mit dem Prozess. WaitForExit (), die für immer warten wird, damit das untergeordnete Projekt beendet wird. Die Standardgröße beider Streams beträgt 4096 Bytes. Sie können diese beiden Größen mit diesen Batch-Dateien testen: Das erste Skript schreibt 4096 Bytes auf Standardausgabe und das zweite auf Standardfehler. Sparen Sie eine davon in C: testbuffsize. bat und führen Sie unseren Programmaufrufprozess aus. WaitForExit () vor Ausgabevorgang. StandardOutput. ReadToEnd () wie in Code 2. Sie können es tun, schreiben Sie CommandResult Ergebnis ExecuteShellCommandSync (c: testbuffsize. bat, 1000) an Zeile 13 von Code 1. Der Code wird nicht hängen, aber wenn Sie ein weiteres Byte in einem der beiden Streams schreiben, wird es die Puffergröße überlaufen, die das Programm macht aufhängen. Wenn Sie den Standardausgang oder den Standarfehler umleiten und lesen müssen, ist die beste Lösung, diese asynchron zu lesen. Eine hervorragende Möglichkeit, dies zu tun, wird von Mark Byers in diesem Stackoverflow-Thread vorgeschlagen. Als letztes Ding bemerken Sie bitte, dass, wenn das Kind-Prozess beendet, nur weil Sie den Prozess verwenden. WaitForExit (Timeout) Signatur und es geht eigentlich in Timeout Sie sollten den cmd. exe Prozess und seine möglichen Kinder zu töten.

No comments:

Post a Comment