Thursday 29 June 2017

C # Thread Waitforexit

C 3.5 Winforms App. Ich habe einen Timer, der alle 30 Sekunden auf separaten Thread (alles, was es tut, schreibt eine Textfolge an das VS-Ausgabefenster) ausgelöst. Ich habe auch einen anderen Thread, der wartet auf einen bestimmten Prozess zu beenden, wenn es startet. Zum Beispiel winword. exe. In diesem Thread habe ich diesen Code: Und es wird dort sitzen und warten, bis winword. exe zu beenden. Das geht gut. Allerdings, während es sitzt und warten auf winword. exe zu beenden, wird die 30 Sekunden Timer auf einem völlig separaten Thread (das Text an das Ausgabefenster sendet) nie ausgeführt. Wenn ich warten 3 Minuten (so dass der andere Timer sollte 6 mal laufen an diesem Punkt, aber es nicht, während WaitForExit () wartet), und dann beenden ich winword. exe plötzlich meine andere Timer läuft 6 mal auf einmal . Es ist wie es einen Rückstand des Timer-Ereignisses und plötzlich. Net will, um sie alle zur gleichen Zeit. Warum p. WaitForExit () scheint meine gesamte Anwendung zu blockieren, obwohl ich es ausführen von einem separaten Thread in meiner App (nicht die wichtigsten UI-Thread) Edit: Ja, es ist in einem separaten Thread. Hier ist der Code, den ich verwenden, um es zu starten: Hier ist die ProcessCheck () - Methode, die ich habe: Sie haben die richtige Idee Peter, falsche Erklärung. Calling Control. Invoke führt den angegebenen Delegate auf dem UI-Thread aus und blockiert den aufrufenden Thread, bis der UI-Thread seine Ausführung beendet. Was im oben genannten Code geschieht, ist, dass p. WaitForExit sowohl den UI-Thread (weil seine Ausführung auf dem UI-Thread) als auch der aufrufende Thread (der auf den UI-Thread wartet) blockiert. Ndash Tergiver Sie können BeginInvoke aber das würde immer noch WaitForExit auf dem UI-Thread und blockieren Sie es. Wenn der Code, der momentan aufruft, sich in einem Hintergrund-Thread befindet, kannst du WaitForExit direkt anrufen, wodurch der Hintergrund-Thread anstelle des UI-Threads blockiert wird. Wenn Sie einige weitere Details über das, was you39re wirklich versuchen zu tun, kann jemand in der Lage, mehr Details zur Verfügung stellen. Ndash Peter Ritchie Jul 30 12 at 17: 52Wie dauerhaft ist WaitForExit (). Ich meine, es gibt etwas / eine Alternative, die man tun kann, um das Warten zu brechen, sonst werde ich meinen Thread in einer separaten Funktion ausführen und ihn durch globale Variablen steuern. Grund - ein CMD. EXE-Thread, bei dem eine Konsolenanwendung ausgeführt wird, die wir vor dem Thread beenden müssen, der seinen Kurs ausführt. Hier ist, was wir haben: Process psi new Process (quotCMD. EXEquot, query) psi. UseShellExecute useShellExec psi. RedirectStandardOutput stdout psi. CreateNoWindow nowindow hbProc neue Process () hbProc Process. Start (psi) hbProc. WaitForExit () Nun, man könnte Verwendung: while (hbProc. WaitForExit (someTimeout)) if (ShouldCancel) Pause Am 19. September, 5:15 Uhr, quotMarc Gravellquot ltmarc. grav. gt schrieb: gt Nun, man könnte verwenden: gt gt während (hbProc. WaitForExit (someTimeout)) gt if (ShouldCancel) brechen gt gt gt gt Marc (beachten Sie, gibt es keinen Grund sowohl der neue Prozess () aufrufen und den Prozess. Start (psi) Oder Sie könnten verwenden: hbProc neue Process () hbProc. EnableRaisingEvents wahre hbProc. Exited neuen Event-Handler (functionToCallAfterProcesit) hbProc. StartInfo psi hbProc. Start () // anderen Thread - auf Mangel Veranstaltung abzusagen: hbProc - neu Event-Handler (functionToCallAfterProcesit) In jedem Fall werden nur sich der möglichen Racebedingung zwischen dem Prozess austritt und dem Wunsch, die Wartezeit zu stornieren Am 19. September, 04.11 Uhr, Alistair George ltnon xtra. co. nzgt schrieb:.. gt Wie . Dauer ist WaitForExit () ich meine, ist es etwas / eine gt alternative man die Wartezeit zu tun zu brechen sonst werde ich meinen Thread gt in einer separaten Funktion ausführen, und es durch globale Variablen zu steuern gt Grund -. cmd. exe Faden, Mit einer Konsolenanwendung ausgeführt wird, die wir gt Notwendigkeit, vor dem Thread zu beenden, der seinen Kurs läuft. Hier gt ist, was wir haben: gt Process psi neue gt Process (quotCMD. EXEquot, Abfrage) gt psi. UseShellExecute useShellExec gt psi. RedirectStandardOutput stdout gt psi. CreateNoWindow nowindow gt hbProc neue Process () gt hbProc Process. Start (psi) gt HbProc. WaitForExit () gt gt Danke, gt Alistair. Sie können entweder den Thread, der WaitForExit () ausführt, töten oder die Überladung verwenden, mit der Sie ein Timeout bool WaitForExit (int msToWait) angeben können. Wenn Sie es in einem separaten Thread und töten es youre gehen, um eine unterbrochene Ausnahme erhalten. Möglicherweise möchten Sie sicherstellen, dass der Prozess, den Sie gestartet haben, nicht noch läuft (wenn es ist, töten). Gt Sie können den Thread, der WaitForExit () ausführt, entweder töten oder die gt-Überladung verwenden, mit der Sie ein Timeout bool WaitForExit (int gt msToWait) angeben können. Wenn Sie es in einem separaten Thread und töten es youre gt eine unterbrochene Ausnahme erhalten. Vielleicht möchten Sie sicherstellen, dass der gt-Prozess, den Sie gestartet haben, nicht noch läuft (wenn es ist, töten). Gt Danke Jungs mit den Vorschlägen, die nützlich sind. Will raten, welche Option am besten funktioniert. Al. Copyright-Kopie 2005-2016, TechTalkz. Alle Rechte vorbehalten. 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 fehl: Das führt mich, dass, irgendwie zu glauben, der Prozess ist noch am Leben und Verriegeln Sie die ausführbare Datei auch nach den. WaitForExit () Aufruf zurückkehrt. Ich habe andere Themen auf dem Netz gefunden, die das gleiche Verhalten beschreiben, aber ich habe jeden, der Schluss mit einer vernünftigen Erklärung oder Lösung für das Problem, andere als Vorschläge der Platzierung eines Sleep (n) nach dem WaitForExit nicht gefunden (). 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 Korrektur für diese (außer Putting Schlaf im Code) Freitag, 08. 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 können nicht auf etwas warten, das nicht vorhanden ist (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 eine Teilnahme entscheiden, wird Ihnen die Online-Umfrage präsentiert, wenn Sie die Msdn-Website verlassen. Möchten Sie teilnehmen


No comments:

Post a Comment