Ich habe eine Situation, wo ich eine Datei ausführen möchten, und löschen Sie die ausführbare Datei, wenn die Ausführung abgeschlossen ist. Ich benutze System. Diagnostics. Process. Start (), um die Datei auszuführen, und verwenden Sie. WaitForExit (), um zu warten, bis der Prozess abgeschlossen ist. Dann verwende ich File. Delete (Dateiname), um die ausführbare Datei zu löschen. Das Problem ist, dass manchmal File. Delete mit dem folgenden Fehler fehlschlägt: Das führt mich zu glauben, dass irgendwie der Prozess noch lebt und die ausführbare Datei sperrt, auch nachdem der. WaitForExit () - Aufruf zurückgegeben wird. Ich habe andere Threads im Netz gefunden, die das gleiche Verhalten beschreiben, aber ich habe keine gefunden, die mit einer vernünftigen Erklärung oder Lösung des Problems abschließen, außer Anregungen, einen Sleep (n) nach dem WaitForExit () zu setzen. Beispiele: Hier ist ein Beispielprogramm, das das Problem für mich reproduziert. Ich habe auf Windows XP und Windows 7 getestet, und sie beide schließlich scheitern an einem gewissen Punkt mit dem gleichen Fehler. Beachten Sie auch, dass die ss. exe-ausführbare Datei eine einfache einfache Hello Worldquot-Konsolenanwendung ist. Und die Ausgabe in der Regel sieht so etwas aus (mit unterschiedlicher Anzahl von Iterationen vor dem Absturz auftritt): Irgendwelche Ideen, warum dies geschieht, und wenn es einige Fix für diese (außer Putting Schlaf in den Code) Freitag, 8. Januar 2010 3 : 40 PM Der Grund ist, dass, obwohl der Prozess abgeschlossen ist, kann es ein paar Millisekunden für das Betriebssystem bis zum Ende der Zerstörung dauern. Sein ein multi-tasking OS schließlich, sein Versuchen, jeder zur gleichen Zeit instandzuhalten. Unglücklicherweise gibt es keine Möglichkeit zu wissen, wann die Datei nicht mehr gesperrt ist (voraussichtlich). Wenn Sie WaitForExit, erstellen Sie ein Sperrobjekt auf dem Prozessobjekt. Das Prozessobjekt kann nicht zerstört werden, bis die Sperre freigegeben wird und Sie nicht auf etwas warten können, das nicht existiert (Huhn und Eiart von Ausgabe). Also die einzige vernünftige Sache, die Sie tun können, ist immer versuchen, etwas wie: Marked als Antwort von Samuel Stanojevic Freitag, 8. Januar 2010 16.20 Uhr Redigiert von Tergiver Freitag, 8. Januar 2010 16.20 Uhr geändert, um bool, Endlosschleife Fix Freitag, 08. Januar 2010 16:15 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 teilnehmenProcess. WaitForExit () Nicht funktioniert RSS Process. WaitForExit () Nicht funktioniert Jun 01, 2004 07:30 PM 124 MCRen 124 LINK Ich habe ein ASP. NET-Formular, das eine asynchrone Methode startet, die durch eine Liste der ausführbaren Dateien durchläuft Dateien und startet sie aus In der Schaltfläche klicken Ich rufe meine async-Methode Meine Methode hat die folgende Schleife Aus irgendeinem Grund die Wartezeit für den Ausgang scheint nicht zu tun. Diese Schleife wartet überhaupt nicht. Wenn ich 4 ausführbare Dateien qu. vbsquot haben, beginnen sie alle ziemlich viel zur gleichen Zeit. Irgendwelche Ideen auf, warum dieses nicht scheinen, zu arbeiten, wäre nützlich. Ich habe versucht, dies ausführen innerhalb eines Windows-Dienstes und es hatte das gleiche Problem. Ich muss etwas fehlen. WaitForExit-Methode () WaitForExit () stellt den aktuellen Thread ab, bis der zugehörige Prozess beendet wird. Es sollte aufgerufen werden, nachdem alle anderen Methoden auf den Prozess aufgerufen werden. Verwenden Sie das Ereignis Exited, um zu verhindern, dass der aktuelle Thread blockiert wird. Diese Methode weist die Prozesskomponente an, eine unendlich lange Zeit zu warten, damit der Prozess und die Ereignisbehandlungsroutinen beendet werden können. Dies kann dazu führen, dass eine Anwendung nicht mehr reagiert. Wenn Sie beispielsweise CloseMainWindow für einen Prozess aufrufen, der über eine Benutzeroberfläche verfügt, wird die Anforderung an das Betriebssystem, den zugeordneten Prozess zu beenden, möglicherweise nicht bearbeitet, wenn der Prozess geschrieben wird, um niemals in seine Nachrichtenschleife zu gelangen. In. NET Framework 3.5 und früheren Versionen wartete die WaitForExit () - Überladung für MaxValue Millisekunden (ca. 24 Tage), nicht unbegrenzt. Auch frühere Versionen warteten nicht, bis die Ereignishandler beendet wurden, wenn die volle MaxValue-Zeit erreicht war. Diese Überlastung stellt sicher, dass alle Verarbeitung abgeschlossen ist, einschließlich der Handhabung von asynchronen Ereignissen für die umgeleitete Standardausgabe. Sie sollten diese Überladung nach einem Aufruf der WaitForExit (Int32) - Uberladung verwenden, wenn die Standardausgabe auf asynchrone Ereignisbehandlungsroutinen umgeleitet wurde. Wenn ein zugehöriger Prozess beendet wird (dh, wenn er durch das Betriebssystem durch eine normale oder abnormale Beendigung beendet wird), speichert das System Verwaltungsinformationen über den Prozess und kehrt zu der Komponente zurück, die WaitForExit () aufgerufen hat. Die Process-Komponente kann dann auf die Informationen zugreifen, zu denen auch die ExitTime gehört. Indem Sie den Handle für den beendeten Prozess verwenden. Da der zugehörige Prozess beendet ist, weist die Handle-Eigenschaft der Komponente nicht mehr auf eine vorhandene Prozessressource hin. Stattdessen kann der Handle nur verwendet werden, um auf die Betriebssystem-Informationen über die Prozessressource zuzugreifen. Das System ist sich bewusst, dass Handles für verlassene Prozesse, die nicht von Process-Komponenten freigegeben wurden, bewahrt werden, sodass es die ExitTime - und Handle-Informationen im Speicher beibehält, bis die Prozesskomponente die Ressourcen spezifisch freigibt. Wenn Sie Start für eine Prozessinstanz aufrufen, rufen Sie deshalb Close auf, wenn der zugehörige Prozess beendet wurde und Sie keine Verwaltungsinformationen mehr benötigen. Schließen beendet den Speicher, der dem beendeten Prozess zugewiesen ist.
No comments:
Post a Comment