Monday 5 December 2016

Waitforexit Wartet Nicht

Ich bin benutzerdefinierte Aktion in meinem VS2008 Setup-Projekt (MSI-Installer). Ich rufe eine Batch-Datei, um eine Datenbank zu erstellen und diese Dateien nach löschen möchten. Ich habe WaitForExit (), aber es wird nicht warten. Warum kein Unterschied zu startInfo. UseShellExecute true Der Batch wurde problemlos ausgeführt, da er Benutzereingaben erfordert und ich y und n für Fragen eingegeben habe. Aber das Löschen Aktion geschah vor meiner Eingabe. Und ich habe eine Pause am Ende der Batch-Datei. Ich kann den Prozess der Batch-Datei gehen. EDIT: Ich habe mehr als 10 Mal getestet, es hat nicht funktioniert. Nach dem Mittagessen habe ich noch eine waitForExit und eine while-Schleife mit HasExited überprüft. Es wird in der while-Schleife schlafen. Ich fand es funktioniert. Dann löschte ich diesen Extracode, zurück zu einem WaitForExit. Es scheint Arbeit jetzt. Ich habe eine Situation, wo ich eine Datei ausführen möchten, und löschen Sie dann 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 Exit-Befehl in der Befehlsliste zu participateAdd: System. Diagnostics. ProcessStartInfo si neue System. Diagnostics. ProcessStartInfo (quotcmd. exequot) true si. RedirectStandardOutput wahr si. RedirectStandardError wahr si. UseShellExecute falsch si. CreateNoWindow wahr si si. RedirectStandardInput. WindowStyle System. Diagnostics. ProcessWindowStyle. Hidden System. Diagnostics. Process Konsole System. Diagnostics. Process. Start (si) console. StandardInput. WriteLine (quotsome commandsquot) console. StandardInput. WriteLine (quotEXITquot) Bitte die Post als Antwort markieren, wenn es Ist hilfreich für Sie, weil es die Mitglieder stärkt, um mehr und mehr zu beantworten. Vorgeschlagen als Antwort von Sudhir Montag, 7. September 2009 10.26 Uhr als Antwort markiert durch YiChun Chen Montag, 14. September 2009 02.29 Uhr Montag, 7. September 2009 08.59 Alle Antworten Vielleicht ist die Anwendung nicht sichtbar jede Länger, aber noch läuft. Ist der Rückgabewert der console. WaitForExit () wahr oder falsch Geert van Horrik - CatenaLogic besuchen Sie mein Blog: blog. catenalogic Suche nach einem Weg Ihre Updates auf alle Ihre Kunden Versuchen Montag, Updater 7. September 2009 zu implementieren 08.58 Fügen Sie Exit-Befehl in der Befehlsliste: System. Diagnostics. ProcessStartInfo si neue System. Diagnostics. ProcessStartInfo (quotcmd. exequot) true si. RedirectStandardOutput wahr si. RedirectStandardError wahr si. UseShellExecute falsch si. CreateNoWindow wahr si. WindowStyle-System si. RedirectStandardInput. Diagnostics. ProcessWindowStyle. Hidden System. Diagnostics. Process Konsole System. Diagnostics. Process. Start (si) console. StandardInput. WriteLine (quotsome commandsquot) console. StandardInput. WriteLine (quotEXITquot) Bitte die Post als Antwort markieren, wenn es ist hilfreich zu Ihnen Denn es steigert die Mitglieder mehr und mehr zu beantworten. Vorgeschlagen als Antwort von SuDhiR Montag, September 07, 2009 10:26 AM Als Antwort von YiChun Chen Montag, September 14, 2009 8:59 AM Wenn Sie eine Instanz der cmd erstellen. Exe-Prozess, startet er den Befehlsprozessor. Das Umleiten der Standardeingabe und das Senden eines Befehls an den Prozess führt dazu, dass cmd. exe (Befehlsprozessor) den Befehl ausführt, und der Befehl wird beendet, aber der Befehlsprozessor fährt fort, auf den nächsten Befehl zu warten (dies ist ähnlich wie beim Starten eines Benutzers) Die Befehlskonsole, indem Sie cmd. exe in der Windows-Eingabeaufforderung eingeben). Um die Befehlskonsole zu beenden, müssen Sie den Exitbefehl speziell an den Befehlsprozessor schicken (wie von SuDhiR vorgeschlagen) oder machen Sie Ihren Befehl eine Batchdatei und führen Sie die Batchdatei anstelle von cmd. exe aus. Montag, September 07, 2009 9:17 AM Addieren Sie den Kommandozeilenargumenten, so dass cmd. exe nach dem Ausführen der Befehle automatisch beendet wird. Hans Passant. Markiert als Antwort von YiChun Chen Montag, September 14, 2009 9:30 AM 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 Helfen Sie uns, MSDN zu verbessern. Besuchen Sie unsere UserVoice Seite, um auf Ideen Dev Centers Lernressourcen vorzulegen und abzustimmen


No comments:

Post a Comment