Wie dauerhaft ist WaitForExit (). Ich meine, gibt es irgendetwas 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. Ursache - ein CMD. EXE-Thread, mit einer Konsolenanwendung ausgeführt wird, die wir aus dem vor dem Thread, der seinen Kurs ausgeführt wird, abbrechen müssen. Hier ist, was wir haben: ProcessStartInfo psi neue ProcessStartInfo (quotCMD. EXEquot, Abfrage) psi. UseShellExecute useShellExec psi. RedirectStandardOutput stdout psi. CreateNoWindow noWindow hbProc new Process () hbProc Process. Start (psi) hbProc. WaitForExit () Nun, Sie könnten Verwendung: while (hbProc. WaitForExit (someTimeout)) if (ShouldCancel) brechen Am 19. September, 5:15 Uhr, quotMarc Gravellquot ltmarc. grav. Gt schrieb: gt Nun könnten Sie verwenden: gt gt while (hbProc. WaitForExit (someTimeout)) gt if (ShouldCancel) brechen gt gt gt gt Marc (beachten Sie, gibt es keinen Grund, sowohl die neue Process () und den Prozess aufzurufen. Start (psi) Oder Sie könnten: hbProc new Process () hbProc. EnableRaisingEvents true hbProc. Exited new EventHandler (functionToCallAfterProcesit) hbProc. StartInfo psi hbProc. Start () Anderer Thread - ein will Ereignis abbrechen: hbProc - new EventHandler ( FunktionToCallAfterProcesit) In jedem Fall, nur bewusst sein, die potenzielle Race-Bedingung zwischen dem Prozess verlassen und der Wunsch, die Wartezeit abzubrechen. Am 19. September, 4:11 Uhr, Alistair George ltnon xtra. co. nzgt schrieb: gt Wie dauerhaft ist Hallo Leute, ich habe eine Frage, wie ich das machen kann Anwendung läuft, die wir gt Notwendigkeit, aus der vor dem Thread, der seinen Kurs läuft zu stornieren. Gt Hier ist, was wir haben: gt ProcessStartInfo psi new gt ProcessStartInfo (quotCMD. EXEquot, Abfrage) gt psi. UseShellExecute useShellExec gt psi. RedirectStandardOutput stdout gt psi. CreateNoWindow noWindow gt hbProc new Prozess () gt hbProc Process. Start (psi) gt HbProc. WaitForExit () gt gt Danke, gt Alistair. Sie können entweder töten den Thread mit WaitForExit () oder verwenden Sie die Überladung, die 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 entweder den Thread töten, der WaitForExit () ausführt, oder die gt-Überladung verwenden, die es Ihnen erlaubt, eine Zeitüberschreitung anzugeben, die Sie mit dem Befehl woolforExit (int gt msToWait) beenden können. Wenn Sie es in einem separaten Thread und töten es youre gt eine unterbrochene Ausnahme erhalten. Möglicherweise 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. Werde beraten, welche Option am besten funktioniert. Al. Copyright-Kopie 2005-2016, TechTalkz. Alle Rechte vorbehalten. Elina: Vielen Dank für Ihre Antwort. Es gibt einige Notizen am unteren Rand dieses MSDN-Dokuments (msdn. microsoften-uslibraryhellip), die vor potenziellen Deadlocks warnen, wenn Sie das Ende der beiden umgeleiteten Stdout - und Stderr-Streams synchron lesen. Es ist schwer zu sagen, ob Ihre Lösung anfällig für dieses Problem ist. Auch scheint es, dass Sie den Prozess39 stdoutstderr Ausgang rechts zurück als Eingang senden. Warum. ) Ndash Matthew Piatt Dies ist eine moderne, TPL-basierte Lösung (Task Parallel Library, TPL) basierte Lösung für 4.5 und höher. Antwort # 2 am: Juli 12, 2010, 07:10:13 am »Ich Sache, dass dies ist einfach und besser Ansatz (wir brauchen nicht AutoResetEvent): Antwort # 2 am: Mai 12, 2010, 10:12:13 pm» True, aber shouldn39t Sie tun. FileName Pfad quotggsci. exequot lt Obeycommand. txtquot, um Ihren Code zu zu vereinfachen Oder vielleicht etwas gleichbedeutend mit quotecho Befehl quotieren Pfad quotggsci. exequot, wenn Sie wirklich don39t eine separate obeycommand. txt-Datei verwenden möchten. Ndash Amit Naidu Ihre Lösung braucht nicht AutoResetEvent aber Sie Umfrage. Wenn Sie statt der Verwendung von Ereignis (wenn sie verfügbar sind) abstimmen, dann verwenden Sie CPU ohne Grund und dass Sie sind ein schlechter Programmierer. Ihre Lösung ist wirklich schlecht, wenn die anderen mit AutoResetEvent verglichen werden. (Aber ich habe dir nicht gegeben, weil du versucht hast zu helfen). Ndash Eric Ouellet Ich war mit dem gleichen Problem, aber der Grund war anders. Es würde jedoch unter Windows 8, aber nicht unter Windows 7 auftreten. Die folgende Zeile scheint das Problem verursacht haben. Die Lösung war, NICHT deaktivieren UseShellExecute. Ich erhielt nun ein Shell-Popup-Fenster, das unerwünscht ist, aber viel besser als das Programm wartet auf nichts Besonderes passieren. So fügte ich die folgenden Work-around für das: Jetzt ist das einzige, was mich stört, warum dies geschieht unter Windows 8 an erster Stelle. Ich habe versucht, eine Klasse, die Ihr Problem mit Hilfe von asynchronen Stream zu lösen, indem Sie in Konto Mark Byers, Rob, stevejay Antworten lösen würde. Dabei erkannte ich, dass es einen Fehler im Zusammenhang mit asynchrone Prozess-Ausgabe-Stream zu lesen. Sie können das nicht tun: Sie erhalten System. InvalidOperationException. StandardOut wurde nicht weitergeleitet oder der Prozess hat noch nicht begonnen. Danach müssen Sie die asynchrone Ausgabe starten, die nach dem Start des Prozesses gelesen wird. Führen Sie deshalb eine Racebedingung aus, da der Ausgabestream Daten empfangen kann, bevor Sie ihn auf asynchron setzen. Dann könnten einige Leute sagen, dass Sie nur den Stream vor Ihnen lesen müssen Setzen Sie es auf asynchron. Aber das gleiche Problem tritt auf. Es wird eine Racebedingung zwischen dem synchronen Lesen und dem Setzen des Streams in den asynchronen Modus geben. Es gibt keine Möglichkeit, das sichere asynchrone Lesen eines Ausgabestreams eines Prozesses in der eigentlichen Weise zu erledigen. Process und ProcessStartInfo wurden entworfen. Sie sind wahrscheinlich besser mit asynchronen Lesen wie von anderen Benutzern für Ihren Fall vorgeschlagen. Aber Sie sollten sich bewusst sein, dass Sie einige Informationen aufgrund Rasse Zustand verpassen könnte. Elina: Vielen Dank für Ihre Antwort. Es gibt einige Notizen am unteren Rand dieses MSDN-Dokuments (msdn. microsoften-uslibraryhellip), die vor potenziellen Deadlocks warnen, wenn Sie das Ende der beiden umgeleiteten Stdout - und Stderr-Streams synchron lesen. Es ist schwer zu sagen, ob Ihre Lösung anfällig für dieses Problem ist. Auch scheint es, dass Sie den Prozess39 stdoutstderr Ausgang rechts zurück als Eingang senden. Warum. ) Ndash Matthew Piatt Dies ist eine moderne, TPL-basierte Lösung (Task Parallel Library, TPL) basierte Lösung für 4.5 und höher. Antwort # 2 am: Juli 12, 2010, 07:10:13 am »Ich Sache, dass dies ist einfach und besser Ansatz (wir brauchen nicht AutoResetEvent): Antwort # 2 am: Mai 12, 2010, 10:12:13 pm» True, aber shouldn39t Sie tun. FileName Pfad quotggsci. exequot lt Obeycommand. txtquot, um Ihren Code zu zu vereinfachen Oder vielleicht etwas gleichbedeutend mit quotecho Befehl quotieren Pfad quotggsci. exequot, wenn Sie wirklich don39t eine separate obeycommand. txt-Datei verwenden möchten. Ndash Amit Naidu Ihre Lösung braucht nicht AutoResetEvent aber Sie Umfrage. Wenn Sie statt der Verwendung von Ereignis (wenn sie verfügbar sind) abstimmen, dann verwenden Sie CPU ohne Grund und dass Sie sind ein schlechter Programmierer. Ihre Lösung ist wirklich schlecht, wenn die anderen mit AutoResetEvent verglichen werden. (Aber ich habe dir nicht gegeben, weil du versucht hast zu helfen). Ndash Eric Ouellet Ich war mit dem gleichen Problem, aber der Grund war anders. Es würde jedoch unter Windows 8, aber nicht unter Windows 7 auftreten. Die folgende Zeile scheint das Problem verursacht haben. Die Lösung war, NICHT deaktivieren UseShellExecute. Ich erhielt nun ein Shell-Popup-Fenster, das unerwünscht ist, aber viel besser als das Programm wartet auf nichts Besonderes passieren. So fügte ich die folgenden Work-around für das: Jetzt ist das einzige, was mich stört, warum dies geschieht unter Windows 8 an erster Stelle. Ich habe versucht, eine Klasse, die Ihr Problem mit Hilfe von asynchronen Stream zu lösen, indem Sie in Konto Mark Byers, Rob, stevejay Antworten lösen würde. Dabei erkannte ich, dass es einen Fehler im Zusammenhang mit asynchrone Prozess-Ausgabe-Stream zu lesen. Sie können das nicht tun: Sie erhalten System. InvalidOperationException. StandardOut wurde nicht weitergeleitet oder der Prozess hat noch nicht begonnen. Danach müssen Sie die asynchrone Ausgabe starten, die nach dem Start des Prozesses gelesen wird. Führen Sie deshalb eine Racebedingung aus, da der Ausgabestream Daten empfangen kann, bevor Sie ihn auf asynchron setzen. Dann könnten einige Leute sagen, dass Sie nur den Stream vor Ihnen lesen müssen Setzen Sie es auf asynchron. Aber das gleiche Problem tritt auf. Es wird eine Racebedingung zwischen dem synchronen Lesen und dem Setzen des Streams in den asynchronen Modus geben. Es gibt keine Möglichkeit, das sichere asynchrone Lesen eines Ausgabestreams eines Prozesses in der eigentlichen Weise zu erledigen. Process und ProcessStartInfo wurden entworfen. Sie sind wahrscheinlich besser mit asynchronen Lesen wie von anderen Benutzern für Ihren Fall vorgeschlagen. Aber Sie sollten sich bewusst sein, dass Sie einige Informationen aufgrund Rasse Zustand verpassen konnte. Wie permanent ist WaitForExit (). Ich meine, gibt es irgendetwas 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. Ursache - ein CMD. EXE-Thread, mit einer Konsolenanwendung ausgeführt wird, die wir aus dem vor dem Thread, der seinen Kurs ausgeführt wird, abbrechen müssen. Hier ist, was wir haben: ProcessStartInfo psi neue ProcessStartInfo (quotCMD. EXEquot, Abfrage) psi. UseShellExecute useShellExec psi. RedirectStandardOutput stdout psi. CreateNoWindow noWindow hbProc new Process () hbProc Process. Start (psi) hbProc. WaitForExit () Nun, Sie könnten Verwendung: while (hbProc. WaitForExit (someTimeout)) if (ShouldCancel) brechen Am 19. September, 5:15 Uhr, quotMarc Gravellquot ltmarc. grav. Gt schrieb: gt Nun können Sie: gt gt while (hbProc. WaitForExit (someTimeout)) gt if (ShouldCancel) brechen gt gt gt gt Marc (beachten Sie, gibt es keinen Grund, sowohl die neue Process () und den Prozess aufzurufen. Start (psi) Oder Sie könnten: hbProc new Process () hbProc. EnableRaisingEvents true hbProc. Exited new EventHandler (functionToCallAfterProcesit) hbProc. StartInfo psi hbProc. Start () Anderer Thread - ein will Ereignis abbrechen: hbProc - new EventHandler ( FunktionToCallAfterProcesit) In jedem Fall, nur bewusst sein, die potenzielle Race-Bedingung zwischen dem Prozess verlassen und der Wunsch, die Wartezeit abzubrechen. Am 19. September, 4:11 Uhr, Alistair George ltnon xtra. co. nzgt schrieb: gt Wie dauerhaft ist Hallo Leute, ich habe eine Frage, wie ich das machen kann Anwendung läuft, die wir gt Notwendigkeit, aus der vor dem Thread, der seinen Kurs läuft zu stornieren. Gt Hier ist, was wir haben: gt ProcessStartInfo psi new gt ProcessStartInfo (quotCMD. EXEquot, Abfrage) gt psi. UseShellExecute useShellExec gt psi. RedirectStandardOutput stdout gt psi. CreateNoWindow noWindow gt hbProc new Prozess () gt hbProc Process. Start (psi) gt HbProc. WaitForExit () gt gt Danke, gt Alistair. Sie können entweder töten den Thread mit WaitForExit () oder verwenden Sie die Überladung, die 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 entweder den Thread töten, der WaitForExit () ausführt, oder die gt-Überladung verwenden, die es Ihnen erlaubt, eine Zeitüberschreitung anzugeben, die Sie mit dem Befehl woolforExit (int gt msToWait) beenden können. Wenn Sie es in einem separaten Thread und töten es youre gt eine unterbrochene Ausnahme erhalten. Möglicherweise 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. Werde beraten, welche Option am besten funktioniert. Al. Copyright-Kopie 2005-2016, TechTalkz. Alle Rechte vorbehalten.
No comments:
Post a Comment