Elina: Danke für deine 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 die process39 stdoutstderr Ausgabe rechts zurück als Eingang senden. Warum. ) Ndash Matthew Piatt Dies ist eine moderne, aufwändige, Task Parallel Library (TPL) basierte Lösung für. NET 4.5 und höher. Antwort # 2 am: Juli 23, 2010, 07:50:13 am »Ich Sache, dass dies einfach und besser Ansatz (wir brauchen nicht AutoResetEvent): Antwort # 2 am: Mai 23, 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 die Umfrage statt der Verwendung von Event (wenn sie verfügbar sind), dann sind Sie mit CPU ohne Grund und dass zeigen, dass Sie ein schlechter Programmierer sind. Ihre Lösung ist wirklich schlecht, wenn die anderen mit AutoResetEvent verglichen werden. (Aber ich habe dir nicht gegeben -1, weil du versucht hast zu helfen). Ndash Eric Ouellet 7. November um 18:38 Ich hatte das gleiche 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 folgende Arbeit-um für das hinzu: Jetzt das einzige, das mich stört, ist, warum dieses geschieht unter Windows 8 an erster Stelle. Ich habe versucht, eine Klasse, die Ihr Problem mit 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. Dann müssen Sie die asynchrone Ausgabe starten, die nach dem Start des Prozesses gelesen wird. Machen Sie also eine Racebedingung, 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 auftritt. 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 tatsächlichen Weise zu erledigen. Process und ProcessStartInfo wurde 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 durch einige Informationen vermissen könnte condition. How Rennen Process. Start in Visual Basic. NET von Dan Mabbutt zu verwenden. Visual Basic Expert Die Start-Methode des Objekts Prozess ist möglicherweise einer der am meisten unterschätzten Werkzeuge zur Verfügung, um Sie als Programmierer. Als eine. NET-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. NET, aber ich wouldn39t es empfehlen. Verwenden Sie stattdessen Process. Start. Sie können diesen Code verwenden, anstatt Notepad maximiert zu starten und eine Process Objekt erstellen, die Sie für eine präzisere Steuerung verwenden können: Dim ProcessProperties As New Process ProcessProperties. FileName 61 34notepad34 ProcessProperties. Arguments 61 34myTextFile. txt34 ProcessProperties. WindowStyle 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 im Task-Manager beenden. Hidden Prozesse sind in der Regel nur mit Prozessen, die don39t haben jede Art von einer Benutzeroberfläche verwendet. Arbeiten mit Process. Start als ein. NET-Objekt gibt Ihnen eine Menge von Funktionen. 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 Ampere myProcess. ExitTime amp Environment. NewLine amp 34Exit Code: 34 Ampere myProcess. ExitCode) Das ist etwas war man nicht mit dem VB6 Shell-Befehl tun konnte, weil es die neue Anwendung gestartet asynchron. Die Verwendung von WaitForExit kann das umgekehrte Problem in. NET verursachen, da Sie einen Prozess in einem neuen Thread starten müssen, wenn Sie es benötigen, um asynchron auszuführen. Wenn Sie zum Beispiel die Komponenten benötigen, um in einem Formular aktiv zu bleiben, 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 zehn Sekunden und beendet den Prozess. Ich fand, dass eine erzwungene Verzögerung war notwendig, damit der Prozess zu beenden Exiting, 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 alles noch einfacher zu gestalten, gibt es sogar eine Prozesskomponente, die Sie zu Ihrem Projekt hinzufügen können, so dass Sie viele 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.
No comments:
Post a Comment