Saturday 15 July 2017

Waitforexit Asynchrony


Es schien mir, dass dieses Asynchroniesystem eine glorreiche Lösung für ein Problem war, das ich habe, wo ich einen externen Prozess starten muss, und dann warten, bis es fertig ist. Derzeit habe ich den folgenden Code auf dem UI-Thread: Prozessprozess neue Process () process. Start () process. WaitForExit () Der Prozess dauert oft einige Sekunden, aber Ive widerstand mit einem Hintergrundarbeiter oder ähnlich, weil es einfach nicht oft passiert Genug, um die Mühe wert zu sein und Code-Scrambling. Ich sah Erwähnung von Erweiterungsmethoden in das Whitepaper, aber es scheint keine Erweiterungsmethode für process. RunAsync () oder etwas ähnliches zu geben, wobei quotalait TaskEx. Run (() gt process. WaitForExit ()) als die einzige Lösung, die aussieht Wie es funktioniert. Das Spinnen eines zusätzlichen Threads, nur um WaitForExit anzurufen, scheint ziemlich dumm zu sein. Ich habe auch keine statischen Methoden gefunden, die in AsyncCtpExtensions, AsyncCtpThreadingExtensions, TaskEx oder TaskExtensions vielversprechend aussahen. Gibt es einen (geplanten) besseren Weg, um die Vollendung des externen Prozesses zu erwarten Freitag, 29. Oktober 2010 18:35 Der Nachteil, den Pool auf diese Weise zu benutzen, ist, dass du einen Thread für die Dauer des Prozesses blockierst. Wenn du nicht viele Prozesse spinnst, kann das kein großes Problem sein, aber es gibt noch keine wirkliche Notwendigkeit, dies zu tun. Stattdessen können Sie eine Aufgabe verwenden, die nicht an einen Thread gebunden ist, z. B. Public static Task ExitedAsync (dieser Prozess p) var tcs new TaskCompletionSourceltobjectgt () p. Exited 43 (s, e) gt tcs. TrySetResult (null) if (p. HasExited) tcs. TrySetResult (null) return tcs. Task Damit, Sie können schreiben: und Sie werden keine Threads blockieren, während asynchron auf den Prozess warten, um zu beenden. Vorgeschlagen als Antwort von Stephen Toub - MSFT Microsoft Mitarbeiter, Moderator Freitag, 29. Oktober 2010 09:29 Als Antwort von Lucian Wischik, MSFT Microsoft Mitarbeiter, Besitzer Samstag, 30. Oktober 2010 10:13 PM Freitag, 29. Oktober 2010 9:28 PM "Spinning up ein zusätzliches Thread nur anrufen WaitForExit scheint ziemlich dumm. quot Wenn Sie die Standard-TPL-Funktionalität verwenden, standardmäßig verwenden Sie ein ThreadPool-Thread. Es sollte wirklich nicht viel Wartezeit zu quotspin upquot der Thread. Da ist dies etwas, was nicht passiert oft genug, um die Mühe wert sein und Code-Scramblingquot, Id nur verwenden: Reed Copsey, Jr. - Reedcopsey Wenn ein Beitrag beantwortet Ihre Frage, klicken Sie bitte auf Anrede Antwort auf diese Post und quot Markiere als hilfreich. Freitag, 29. Oktober 2010 um 19:30 Uhr Der Nachteil, den Pool auf diese Weise zu benutzen, ist, dass du einen Thread für die Dauer des Prozesses blockierst. Wenn du nicht viele Prozesse spinnst, kann das kein großes Problem sein, aber es gibt noch keine wirkliche Notwendigkeit, dies zu tun. Stattdessen können Sie eine Aufgabe verwenden, die nicht an einen Thread gebunden ist, z. B. Public static Task ExitedAsync (dieser Prozess p) var tcs new TaskCompletionSourceltobjectgt () p. Exited 43 (s, e) gt tcs. TrySetResult (null) if (p. HasExited) tcs. TrySetResult (null) return tcs. Task Damit, Sie können schreiben: und Sie werden keine Threads blockieren, während asynchron auf den Prozess warten, um zu beenden. Vorgeschlagen als Antwort von Stephen Toub - MSFT Microsoft Mitarbeiter, Moderator Freitag, 29. Oktober 2010 09:29 Als Antwort von Lucian Wischik, MSFT Microsoft Mitarbeiter, Besitzer Samstag, 30. Oktober 2010 10:13 PM Freitag, 29. Oktober 2010 9:28 PMProzess BeginOutputReadLine Methode () Der StandardOutput Stream kann synchron oder asynchron gelesen werden. Methoden wie Lesen. Zeile lesen. Und ReadToEnd führen synchrone Leseoperationen auf dem Ausgabestream des Prozesses durch. Diese synchronen Leseoperationen werden nicht abgeschlossen, bis der zugehörige Prozess in den StandardOutput-Stream schreibt oder den Stream schließt. Im Gegensatz dazu startet BeginOutputReadLine asynchrone Leseoperationen im StandardOutput-Stream. Diese Methode ermöglicht einen bestimmten Event-Handler für die Stream-Ausgabe und kehrt sofort zum Caller zurück, der andere Arbeiten ausführen kann, während die Stream-Ausgabe an den Event-Handler gerichtet ist. Gehen Sie folgendermaßen vor, um asynchrone Leseoperationen auf StandardOutput für einen Prozess durchzuführen. Fügen Sie Ihren Event-Handler zum OutputDataReceived-Ereignis hinzu. Der Event-Handler muss mit dem System. Diagnostics übereinstimmen. DataReceivedEventHandler-Delegat-Signatur. Rufen Sie BeginOutputReadLine für den Prozess auf. Dieser Aufruf startet asynchrone Leseoperationen auf StandardOutput. Wenn asynchrone Leseoperationen beginnen, wird der Ereignishandler jedes Mal aufgerufen, wenn der zugehörige Prozess eine Textzeile an seinen StandardOutput-Stream schreibt. Sie können einen asynchronen Lesevorgang abbrechen, indem Sie CancelOutputRead aufrufen. Der Lesevorgang kann vom Anrufer oder vom Event-Handler abgebrochen werden. Nach dem Abbrechen können Sie BeginOutputReadLine erneut aufrufen, um asynchrone Leseoperationen fortzusetzen. Sie können nicht asynchrone und synchrone Leseoperationen auf einem umgeleiteten Stream mischen. Sobald der umgeleitete Strom eines Prozesses entweder im asynchronen oder synchronen Modus geöffnet ist, müssen alle weiteren Leseoperationen auf diesem Stream im selben Modus sein. Zum Beispiel folgen Sie nicht BeginOutputReadLine mit einem Aufruf von ReadLine auf dem StandardOutput Stream oder umgekehrt. Allerdings können Sie zwei verschiedene Streams in verschiedenen Modi lesen. Zum Beispiel können Sie BeginOutputReadLine aufrufen und dann ReadLine für den StandardError-Stream aufrufen.

No comments:

Post a Comment