Monday 13 March 2017

Waitforexit Asynchron

Verwendung von Process. Start in Visual Basic Von Dan Mabbutt. Visual Basic-Experte Die Start-Methode des Process-Objekts ist möglicherweise eines der am meisten geschätzten Werkzeuge, die Ihnen als Programmierer zur Verfügung stehen. Als eine Methode hat Start eine Reihe von Überladungen (verschiedene Sätze von Parametern, die genau bestimmen, was die Methode tut). In diesem Fall können Sie mit den Überladungen nahezu jeden Satz von Parametern angeben, den Sie an einen anderen Prozess übergeben möchten, wenn er gestartet wird. Was Sie mit Process. Start tun können, ist wirklich nur durch die Prozesse begrenzt, die Sie mit ihm verwenden können. Lesen Sie weiter unten, was zu sagen ist, gibt es kein Limit seit mehr kommen immer die ganze Zeit. Wenn Sie Ihre textbasierte 34ReadMe34-Datei im Editor anzeigen möchten, ist it39s so einfach wie: Dies setzt voraus, dass sich die ReadMe-Datei im selben Ordner wie das Programm befindet und dass Notepad die Standardanwendung für. txt-Dateitypen und it39s in der Systemumgebung ist Pfad. Für die VB639ers im Publikum ist Process. Start etwas wie der VB6 Shell Befehl. In VB6, könnten Sie etwas wie: lngPID 61 Shell (34MyTextFile. txt34, vbNormalFocus) Sie können noch den Shell-Befehl in VB, aber ich wouldn39t es empfehlen. Verwenden Sie stattdessen Process. Start. Sie können diesen Code stattdessen verwenden, um den Editor zu maximieren und ein ProcessStartInfo-Objekt zu erstellen, das Sie für eine präzisere Steuerung verwenden können: Dim ProcessProperties als neues ProcessStartInfo ProcessProperties. FileName 61 34notepad34 ProcessProperties. Arguments 61 ProcessWindowStyle. Maximized Dim myProcess Als Prozess 61 Process. Start (ProcessProperties) Lesen Sie weiter unten Sie können sogar einen versteckten Prozess starten. ProcessProperties. WindowStyle 61 ProcessWindowStyle. Hidden Aber seien Sie vorsichtig. Es sei denn, Sie fügen Sie mehr Code, um den Prozess zu beenden, müssen Sie es wahrscheinlich in Task-Manager beenden. Versteckte Prozesse werden normalerweise nur bei Prozessen verwendet, die keine Benutzeroberfläche haben. Arbeiten mit Process. Start als ein Objekt gibt Ihnen eine Menge von Fähigkeiten. Sie können beispielsweise den Namen des Prozesses abrufen, der gestartet wurde. Dieser Code wird 34notepad34 im Ausgabefenster anzeigen: Dim myProcess als Prozess 61 Process. Start (34MyTextFile. txt34) Console. WriteLine (myProcess. ProcessName) Wenn Sie die Ausführung Ihres Programms bis zum Ende des Prozesses unterbrechen müssen (etwas, das Sie tun könnten Mit API-Code in VB6), hier ya gehen. Console. WriteLine (34Notepad beendet: 34 amp myProcess. ExitTime amp Environment. NewLine amp 34Exit-Code: 34 amp myProcess. ExitCode) Dies war etwas, was Sie nicht mit dem Befehl VB6 Shell tun konnte, weil es die neue Anwendung asynchron gestartet. Die Verwendung von WaitForExit kann das umgekehrte Problem verursachen, weil Sie einen Prozess in einem neuen Thread starten müssen, wenn Sie es asynchron ausführen müssen. Wenn Sie zum Beispiel die Komponenten in einem Formular aktiv bleiben sollen, in dem ein Prozess gestartet wurde und WaitForExit ausgeführt wurde. Normalerweise werden diese Komponenten nicht aktiv. Code it up und sehen Sie selbst. Eine Möglichkeit, den Prozess zu stoppen, ist, die Kill-Methode zu verwenden. Dieser Code wartet für zehn Sekunden und beendet den Prozess. Ich fand, dass eine erzwungene Verzögerung notwendig war, um den Prozess zu beenden, um einen Fehler zu vermeiden. MyProcess. WaitForExit (10000) 39 Wenn der Prozess doesn39t innerhalb von 39 10 Sekunden abgeschlossen ist, töten Sie es If Not myProcess. HasExited Dann myProcess. Kill () Ende If Threading. Thread. Sleep (1) Console. WriteLine (34Notepad beendet: 34 amp myProcess. ExitTime amp Environment. NewLine amp 34Exit-Code: 34 amp myProcess. ExitCode) In den meisten Fällen ist es wahrscheinlich eine gute Idee, Ihre Verarbeitung in einem Block verwenden, um sicherzustellen, dass die Ressourcen, die von dem Prozess freigegeben werden. Verwenden von myProcess als Prozeß 61 Neuer Prozeß 39 Ihr Code geht hier Ende Verwenden Um dies noch einfacher zu gestalten, gibt es sogar eine Prozesskomponente, die Sie zu Ihrem Projekt hinzufügen können, so dass Sie eine Menge der oben beim Design gezeigten Dinge tun können Zeit statt der Laufzeit. Eines der Dinge, die dies macht viel einfacher ist die Codierung von Ereignissen, die durch den Prozess, wie das Ereignis, wenn der Prozess verlassen hat. Sie können auch einen Handler mit Code wie folgt hinzufügen. 39 erlauben dem Prozess, die Ereignisse zu erhöhen myProcess. EnableRaisingEvents 61 True 39 einen Exited-Ereignishandler hinzufügen AddHandler myProcess. Exited, AddressOf Me. ProcessExited Private Sub ProcessExited (ByVal-Absender als Objekt, ByVal und als System. EventArgs) 39 Ihr Code geht hier End Sub Aber einfach die Auswahl der Veranstaltung für die Komponente ist viel einfacher. Es schien mir, dass dieses Asynchrony-System war eine glorreiche Lösung für ein Problem Ive mit, wo ich einen externen Prozess starten müssen, und dann warten, bis es abgeschlossen ist. Derzeit habe ich den folgenden Code auf dem UI-Thread: Prozess Prozess neu Process () process. Start () process. WaitForExit () Der Prozess dauert oft mehrere Sekunden, aber Ive widerstand mit einem Hintergrund-Worker oder ähnliches, weil es einfach nicht oft passiert Genug, um die Mühe wert sein und Code-Scrambling. Ich habe Erwähnung der Erweiterungsmethoden im Whitepaper, aber es scheint keine Erweiterungsmethode für process. RunAsync () oder etwas ähnliches zu sein, so dass die Quotawait TaskEx. Run () gt process. WaitForExit ()) die einzige Lösung, die aussieht Wie itll Arbeit. Spinning up einen zusätzlichen Faden nur um WaitForExit anzurufen scheint ziemlich dumm. Ich fand auch keine statischen Methoden, die vielversprechend in AsyncCtpExtensions, AsyncCtpThreadingExtensions, TaskEx oder TaskExtensions sah. Gibt es einen (geplanten) besseren Weg, um den Abschluss des externen Prozesses abwarten Freitag, 29. Oktober 2010 18:35 Der Nachteil der Verwendung des Pools auf diese Weise ist, dass Sie einen Thread für die Dauer des Prozesses blockieren werden. Wenn youre nicht drehen viele Prozesse, dies kann nicht ein großes Problem sein, aber theres 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) Rückgabe tcs. Task Damit können Sie, Können Sie schreiben: und Sie werden keine Threads blockieren, während asynchron warten, bis der Prozess beendet wird. Vorgeschlagen als Antwort von Stephen Toub - MSFT Microsoft Mitarbeiter, Moderator Freitag, 29. Oktober 2010 21.29 Uhr Als Antwort von Lucian Wischik, MSFT Microsoft Mitarbeiter, Besitzer Samstag, 30. Oktober 2010 10.13 Uhr Freitag, 29. Oktober 2010 9:28 PM Spinning ein Extra-Thread nur um WaitForExit anzurufen scheint ziemlich dumm. quot Wenn Sie die Standard-TPL-Funktionalität verwenden, wird standardmäßig ein ThreadPool-Thread verwendet. Es sollte wirklich nicht eine Menge Wartezeit zu quotspin upquot der Thread. Da dies etwas ist, das nicht oft genug geschieht, um die Mühe wert sein und Code-scramblingquot, Id nur verwenden: Reed Copsey, Jr. - Reedcopsey Wenn ein Post beantwortet Ihre Frage, klicken Sie bitte auf "Wie eine Antwort auf diesen Post und quot Als hilfreichen Zitat markieren. Freitag, 29. Oktober 2010 19:30 Der Nachteil der Verwendung des Pools auf diese Weise ist, dass Sie einen Thread für die Dauer des Prozesses blockieren werden. Wenn youre nicht drehen viele Prozesse, dies kann nicht ein großes Problem sein, aber theres 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) Rückgabe tcs. Task Damit können Sie, Können Sie schreiben: und Sie werden keine Threads blockieren, während asynchron warten, bis der Prozess beendet wird. Vorgeschlagen als Antwort von Stephen Toub - MSFT Microsoft Mitarbeiter, Moderator Freitag, 29. Oktober 2010 21.29 Uhr Als Antwort von Lucian Wischik, MSFT Microsoft Mitarbeiter, Besitzer Samstag, 30. Oktober 2010 10.13 Uhr Freitag, 29. Oktober 2010 21:28 Uhr


No comments:

Post a Comment