Waitforexit Zeituberschreitung C #




Waitforexit Zeitüberschreitung C #Diese Frage scheint ein wenig seltsam, aber ich versuche, VS2005 durch einen Prozess auszufuhren und fuhren Sie einen bestimmten Befehl und ich waitforexit (). Ich bin die Umleitung meiner Eingabe und Ausgabe erfolgreich, aber immer wieder zufallig erhalten Sie ein Fenster Fehlerberichterstattung Fenster / Nachricht. Das Problem ist, dass ich remoting, also wenn diese Meldung / Fenster wahrend der Prozessausfuhrung auftritt, werde ich hangen, wenn ich in der anderen (Remoting) Maschine anmelden und schlie?en Sie das Fenster. Gibt es eine Moglichkeit, programmgesteuert zu toten dieses Fenster oder moglicherweise deaktivieren Sie die Meldung / Fenster vom Auftreten Ich habe gedacht, VS laufen in einer leisen Ausfuhrung (Ich habe noch einen Weg, dies zu tun). Ich habe auch versucht, um zu sehen, wenn es etwas lachte, wenn dies geschieht, vergleichen, wenn es nicht. Nun, ich versuchte, FindWindow und FindWindowEx zusammen mit SendMessage zu verwenden, aber ich konnte nicht das richtige Fensterhandle zu finden. Aber da ich wei?, dass eine Windows-Fehlermeldung Msssage-Box wird auftauchen, uberprufte ich, um zu sehen, ob es sein eigener Prozess (und es ist). Der Prozess ist dwwin. exe (Dr. Watson Win) und alles, was ich tun musste, war dies, damit ich das aktuelle Problem richtig zu bekommen. Ersetzen Sie den aktuellen Codeblock unten fur die WaitForExit () - Anweisung, die ich zuvor hatte. Proc. WaitForExit (60000) // eine Minute Prozess ProcArray Process. GetProcessesByName (quotdwwinquot) foreach (Prozess ProcessFound in ProcArray) Ich uberprufte auch, um zu sehen, wenn Sie in der Lage, die Process. MainWindowTitle () erhalten, aber es ist auf quotquot gesetzt. Also das ist ein Hack und ich mag es nicht, aber es funktioniert fur die aktuelle Ausfuhrung. Montag, 29. Oktober 2007 19:26 Nein, ich kann die Eingabe und Ausgabe ohne Probleme umleiten. Der Fehler, dass ich empfange, ist die allgemeine Windows-Fehlermeldung und leider ist es in Japanisch, so wei? ich nicht, was der genaue Fehler ist, aber es ist der allgemeine Fehler. Ich habe nicht den Code vor mir, aber ich eingerichtet Delegierten / Threads zu lesen umgeleitet den Fehler und die Ausgabe, nachdem ich den gesamten Prozess beenden. Ich kann nicht kommen mit irgendetwas und ich bin in der Lage, den gleichen Prozess auf meinem eigenen Computer laufen, aber ich bin nicht in der Lage, dies zu tun, einen bestimmten Befehl durch remoting. Ich werde versuchen, es morgen Remoting auf einem nicht-japanischen Maschine bei der Arbeit, und ich werde meine Ergebnisse ungeachtet Post. Freitag, 26. Oktober 2007 02:34 Sind Sie mit der Konsole quotcmdquot. Wenn ja, dann mussen Sie auch exit eingeben. Wenn Sie eine Vorstellung davon, wie viel Zeit Ihr Prozess zu nehmen, dann konnen Sie bool beendet process. WaitForExit (timeInMilliSeconds), wenn (beendet) // Prozess beendet vor Zeituberschreitung. Else // Druck Fehlermeldung Dies kann nicht mit dem, was Sie tun, verwandt werden, aber ich hatte eine Erfahrung, wo der Prozess nicht beenden wurde, wenn ich seine Ausgabe umgeleitet. Versuchen Sie, die Ausgabeumleitung zu deaktivieren und sehen Sie, ob der Prozess beendet wird. Probieren Sie es aus, es konnte funktionieren. Freitag, 26. Oktober 2007 11:58 Ich mochte das versuchen, aber es ist zu viel von einem Hack. Ich habe zu viele verschiedene Befehle, die unterschiedliche Mengen an Zeit (30 Sekunden bis 25 Minuten) nehmen, so gibt es keine Echtzeit-Einstellung, die ich ohne Zerstorung meiner Leistung Platz konnte. Diese Funktion hat fur mehrere Befehle in den letzten 6 Monaten korrekt funktioniert und jetzt entscheidet sie sich auf mich. Ich versuchte es auf einem anderen Computer ohne Probleme (das ist wirklich messing mit mir). Ich wei?, dass es nicht die Ausgabe / Fehlerumleitung ist, weil ein neues WINDOW auf dem Bediener verursacht wird, den ich zu remoting bin. Sobald ich dieses Fenster schlie?e, verlasst mein Prozess wie erwartet und die richtige Ausgabe wird auf der Benutzerseite angezeigt. Vielen Dank fur Ihre Hilfe, aber ich bin wirklich frustriert mit diesem Problem. Freitag, 26. Oktober 2007 um 15:01 Uhr Ohne zu wissen, das Detail der Nachricht waren nur raten das Problem. Haben Sie installiert. NET 3.5 Beta oder Visual Studio 2008 Beta uberhaupt Wie verwenden Sie Prozess, um das Programm zu starten, Process. Start (quotfile. exequot) oder verwenden Sie ProcessStartInfo Freitag, 26. Oktober 2007 15.21 Uhr Nein, Ich habe. NET 2003 und. NET 2005 installiert. Proc new Process () procSI new ProcessStartInfo () Ich setze dann einen neuen Thread fur sowohl den StandardError als auch den StandardOutput ein und schreibe dann meine Befehle und if (Umleitung von standard out) Start thread fur st. Out If (Umleitung Standardfehler) Startthread fur st. Error Proc. WaitForExit () lt -------- Dies ist, wo das Generic Windows Error Reporting Fenster auftritt. Ich ubersetzte, was ich konnte aus dem Fenster, das auftaucht. Microsoft Visual Studio 2005 Da Problem auftritt, beendet es Microsoft Visual Studio 2005. Wir verwenden Unannehmlichkeiten, gibt es keine Entschuldigung. Nochmals vielen Dank fur Ihre Zeit. Ich habe die StreamWriter sIn vor dem Erstellen der proc Process-Objekt. Ich dann umleiten die Eingabe nach dem proc. Start () - Befehl, also wie kann ich nicht besitzen dieses Ungeachtet, kann ich die Anderung, um die sIn. Close () auf nach dem Aufruf von WaitForExit zu sehen, ob dies irgendwelche Anderungen macht verschieben. Das Proc war ein Typ, sollte es proc. Wieder ist es nicht eine Fehlermeldung, also gibt es keine Stapelubertragung. Meine StandardError-Umleitung ist leer und die Standard-OUtput-Umleitung enthalt, was ich erwartet hatte, aber nichts, was auf einen Fehler auftrat. Dies ist, warum alles noch funktioniert, nachdem ich das Fenster Windows Error Reporting schlie?en. Ich werde nach, was passiert, nachdem ich die sIn. Close () Zeile unterhalb der WaitForExit () Zeile. Freitag, 26. Oktober 2007 16:59 Peter Ritchie hat geschrieben: Sie mochten nicht das sIn Objekt schlie?en, bis die Anwendung beendet hat, wenn youre Umleitung. Man sollte nicht schlie?en alle diese Streams uberhaupt. Das Process-Objekt besitzt sie und es ist diejenige, die fur die Reinigung nach sich selbst verantwortlich ist. Am besten sollte man Process. Dispose () nach Abschluss des Process-Objekts aufrufen. Sie sicherlich nicht brauchen (z. B. seine redundante), aber es sollte nicht ein Problem verursachen, nachdem der Prozess beendet hat. Process. Close ist die empfohlene Methode zum Schlie?en der Strome Standardinput und Standardoutput (und Standarderror). Ich wurde uberrascht sein, wenn die Dispose-Methode nicht aufgerufen Close, zumindest als Teil seiner Operation. Ich mochte mit der Tatsache, dass da Prozess implementiert IDisposable (indirekt durch Erweiterung Komponente, die es implementiert), sollte man sich auf Dispose und lassen, dass die ordnungsgema?e Aufraumen. Ich wurde nicht empfehlen aufrufen Process. Close statt, noch zusatzlich zu, Process. Dispose. Ja, Anrufe verwerfen Schlie?en. Meine erste Empfehlung ist, einen verwendenden Block zu verwenden, meine zweite ist, Close aufzurufen, wenn Sie wissen, wann Sie damit fertig sind. In Objekten, die eine quotClosequot-Methode implementieren, obwohl sie IDisposable sind, ist es viel klarer, die "Closequot" - Methode zu verwenden. Plus, ohne einen Benutzungsblock zu verwenden, haben Sie keine Moglichkeit, die Variable und den Aufruf zu Dispose zu scopieren - das Objekt konnte nach dem Aufruf von Dispose verwendet werden. Wenn Sie Close youve verwenden, werden alle verwalteten Ressourcen entfernt, aber das Objekt kann weiterhin verwendet werden (dh es wurde nicht als quotdisposedquot markiert und Sie konnen es verwenden, um eine andere Anwendung auszufuhren, ohne ein neues Process-Objekt zuzuweisen, das sonst eine ObjectDisposedException auslost ). So, wenn die erste Empfehlung ist, einen verwendenden Block zu verwenden, dann ware das nachste am besten zu Dispose zu rufen. Nicht schlie?en, wenn, wie Sie gesagt haben, Sie wissen, dass Sie mit dem Objekt getan. Durch nur Aufruf von Close auf etwas, das IDisposable implementiert, ist der Entwickler moglicherweise einen Fehler machen. Wenn Dispose einige zusatzliche Bereinigung jenseits nur Delegieren zu schlie?en, dann wird der Programmierer sich selbst fur einen Fehler, indem Sie einfach aufrufen Close. Es kann ein Fall fur den Aufruf von Close geben, aber nur, wenn Sie mit dem Objekt nicht fertig sind, wie Sie am unteren Ende Ihrer letzten Antwort angegeben haben. Aber wenn Sie damit fertig sind, rufen Sie Dispose. Also, wenn die erste Empfehlung ist, einen verwendenden Block zu verwenden, dann ware die nachste am besten zu Dispose zu rufen. Nicht schlie?en, wenn, wie Sie gesagt haben, Sie wissen, dass Sie mit dem Objekt getan. Durch nur Aufruf von Close auf etwas, das IDisposable implementiert, ist der Entwickler moglicherweise einen Fehler machen. Wenn Dispose einige zusatzliche Bereinigung jenseits nur Delegieren zu schlie?en, dann wird der Programmierer sich selbst fur einen Fehler, indem Sie einfach aufrufen Close. Es kann ein Fall fur den Aufruf von Close geben, aber nur, wenn Sie mit dem Objekt nicht fertig sind, wie Sie am unteren Ende Ihrer letzten Antwort angegeben haben. Aber wenn Sie damit fertig sind, rufen Sie Dispose. Tatsachlich ist seine QuoteQuote gleichbedeutend mit: DisposableClass obj neu DisposableClass () IDisposable Einweg-obj als IDisposable wenn (Einweg-Null) Aber ja, das ist, was eine using-Anweisung funktionell gleichbedeutend ist, aber ich stimme nicht explizit aufrufen Dispose in Anwesenheit einer quotClosequot-Methode sollte Die erste Wahl wegen des fehlenden Scoping mit dem Dispose-Aufruf sein. Ich habe den Dienst ausgefuhrt, aber ich habe es gestoppt, weil es fur 2 Stunden lief und hatte es nie der Breakpoint, dass es innerhalb von 10 Minuten von mir zu Beginn meines getroffen haben sollte Klient. Ich habe die sIn. Close () - Linie gerade erst kommentiert und den Service neu gestartet und der Client und alles funktioniert wie zuvor. Ich kann den Haltepunkt nach dem WaitForExit () treffen und ich vervollstandige, mit der Windows-Fehlermeldung Meldung noch (wie es vorher war). Also, in meinem Fall, ich muss den Input-Stream zu schlie?en, um den Prozess wie erwartet beenden. Gibt es irgendwelche anderen Ideen kann ich empfehlen die sIn. Close () Zeile, wenn Sie etwas uberprufen mochten. Freitag, 26. Oktober 2007 19:19 Anthony Maimone hat geschrieben: Ich hatte den Dienst ausgefuhrt, aber ich hielt es, weil es fur 2 Stunden lief und hatte es nie der Breakpoint, dass es innerhalb von 10 Minuten von mir begann mein Client getroffen haben sollte . Ich habe die sIn. Close () - Linie gerade erst kommentiert und den Service neu gestartet und der Client und alles funktioniert wie zuvor. Ich kann den Haltepunkt nach dem WaitForExit () treffen und ich vervollstandige, mit der Windows-Fehlermeldung Meldung noch (wie es vorher war). Also, in meinem Fall, ich muss den Input-Stream zu schlie?en, um den Prozess wie erwartet beenden. Gibt es irgendwelche anderen Ideen kann ich empfehlen die sIn. Close () Zeile, wenn Sie etwas uberprufen mochten. Es ware hilfreich, die Ausnahmedetails zu sehen, wenn Sie den Fehler erhalten (wie der Aufruf-Stack). Wie verwenden Sie die Standard-Eingabe und die Standard-Ausgabe Verwenden Sie alle ReadLine-Methoden Peter, mein Punkt ist: Wenn Sie nicht aufrufen Dispose auf ein Objekt, das (direkt oder indirekt) IDisposable implementiert, dann sind Sie nur fragen, fur einen Bug. Ich mochte nicht auf diesem endlos aber argumentieren. Sie konnen weiterhin tun, wie Sie es tun, und ich bleibe bei mir. Solange wir nicht haben, um jeden anderen Code zu halten, fein. Und ubrigens, ein quotusingquot Block schutzt Sie auch nicht. Nichts hindert Sie daran, die Variable au?erhalb des Blocks (wenn ich mich richtig erinnere) zu deklarieren, damit es immer noch im Bereich sein kann, nachdem der Block endet. Sie mussen sorgfaltig schriftlich korrekten Code schreiben. Wenn Sie es in der quotusingquot-Anweisung erklaren, das ist eine Moglichkeit. Aber mit dem try / finally Ansatz zu entlassen, nur weil es die Variable im Umfang lasst ist nicht wirklich der Punkt. Es muss immer noch Dispose () d irgendwo sein. Freitag, 26. Oktober 2007 19:34 Peter Ritchie hat geschrieben: Anthony Maimone schrieb: Ich hatte den Dienst ausgefuhrt, aber ich hielt es, weil es fur 2 Stunden lief und hatte es nie der Breakpoint, dass es innerhalb von 10 Minuten getroffen haben sollte Ich beginne meinen Mandanten. Ich habe die sIn. Close () - Linie gerade erst kommentiert und den Service neu gestartet und der Client und alles funktioniert wie zuvor. Ich kann den Haltepunkt nach dem WaitForExit () treffen und ich vervollstandige, mit der Windows-Fehlermeldung Meldung noch (wie es vorher war). Also, in meinem Fall, ich muss den Input-Stream zu schlie?en, um den Prozess wie erwartet beenden. Gibt es irgendwelche anderen Ideen kann ich empfehlen die sIn. Close () Zeile, wenn Sie etwas uberprufen mochten. Es ware hilfreich, die Ausnahmedetails zu sehen, wenn Sie den Fehler erhalten (wie der Aufruf-Stack). Wie verwenden Sie die Standard-Eingabe und die Standard-Ausgabe Verwenden Sie alle ReadLine-Methoden Wieder ist dies keine Ausnahme, die geworfen wird, so dass ich keine Ausnahme Details sehen. Ich gehe nicht direkt in den catch-Block in meinem Code, ich wieder DIREKT nach dem Aufruf von WaitForExit (). Das Fenster, das ich empfange, ist das gleiche, das Sie erhalten, wenn jedes Microsoft-Produkt unerwartet schlie?t und MS Informationen uber den Crash will. Also wieder gibt es keine Ausnahme Details. Jedoch in einem der Systemprotokolle, bekomme ich eine mesage (ubersetzt aus Japanisch) quotDevenv. exe Anwendung erros auftreten, 8.0.50727.762 Version der Fehler aufgetreten msvcr80.dll-Modul, Version 8.0.50727.762, Fehler aufgetreten Adresse 0x00039001. Fur weitere Informationen, go. microsoft/fwlink/events. asp das Helo und Support Center bitte refer. quot Ich bin die Umleitung der Standard-Eingang, um in den verschiedenen Befehle in, weil ich hatte Schwierigkeiten bekommen sie zu arbeiten, wie ich wollte Form der StartInfo . Ich bin die Umleitung der Ausgabe-und Fehler-Streams zu uberprufen, was sie haben, nachdem sie den Prozess verlassen hat. Dies wird mir erlauben, fur alles, was ich mochte in jedem Stream, wenn wir fertig sind zu uberprufen. Ich auch nicht zulassen, entweder der Ausgang oder Fehler Umleitung Threads zu verbinden, bis nach dem Prozess hat den Aufruf von WaitForExit ubergeben. Ich bin vollig verstopft. Peter, mein Punkt ist: Wenn Sie nicht aufrufen Dispose auf ein Objekt, das (direkt oder indirekt) IDisposable implementiert, dann youre nur fragen, fur einen Bug. Ich mochte nicht auf diesem endlos aber argumentieren. Sie konnen weiterhin tun, wie Sie es tun, und ich bleibe bei mir. Solange wir nicht haben, um jeden anderen Code zu halten, fein. Ich stimme nicht zu. Sein nicht ein quotbugquot, zum von Dispose nicht zu benennen. Ihre Ressourcen werden nicht sofort befreit, aber die GC wird sie freigeben, wenn sie den Speicher braucht (vorausgesetzt das Dispose-Muster ist richtig implementiert und ein Finalizer existiert). Wenn die Klasse youre mit implementiert eine quotClosequot - Methode, die nicht alle die gleichen Dinge wie quotDisposequot, Schlie?en sollte entweder als solche oder theres ein Fehler in der Klasse dokumentiert werden. Ive nie begegnet eine Framework-Klasse implementiert IDisposable und eine Close () - Methode, die einen quotleakquot eingefuhrt, wenn Close aufgerufen wurde, ohne Aufruf Dispose. Das uberwaltigende Muster fur Dispose / Close ist, dass Dispose calls Close sowie das Setzen eines quotdisposedquot-Flags (fur das Werfen von ObjectDisposedException) verwendet wird. In der Tat ist dies in der. NET Framework General Reference: quotOccasionally ein Domain-spezifischer Name ist geeigneter als Dispose. Beispielsweise konnte eine Dateikapselung den Methodennamen Close verwenden. In diesem Fall implementieren Sie Dispose privat und erstellen eine offentliche Close-Methode, die Dispose aufruft. Das folgende Codebeispiel veranschaulicht dieses Muster. Sie konnen Close durch einen Methodennamen ersetzen, der zu Ihrem domain. quot passt. Implementieren von Finalize und Entsorgen von nicht verwalteten Ressourcen Sowohl fur bestimmte Klassen von Objekten wie Dateien oder Datenbankverbindungsobjekten reprasentiert eine Methode Close die logische Operation Sollte durchgefuhrt werden, wenn der Objektkonsumenten mit dem object. quot aus dem Verbessern der Managed Code Performance beendet wird (obwohl es auch es auch Details in gut geschriebenen Fallen, beide funktional gleichwertig sind. Impliziert dies, dass die Verwendung von Close ist klarer mit quotbetter representquot.) Und ubrigens, ein quotusingquot Block schutzt Sie auch nicht. Nichts hindert Sie daran, die Variable au?erhalb des Blocks (wenn ich mich richtig erinnere) zu deklarieren, damit es immer noch im Bereich sein kann, nachdem der Block endet. Sie mussen sorgfaltig schriftlich korrekten Code schreiben. Wenn Sie es in der quotusingquot-Anweisung erklaren, das ist eine Moglichkeit. Aber mit dem try / finally Ansatz zu entlassen, nur weil es die Variable im Umfang lasst ist nicht wirklich der Punkt. Es muss immer noch Dispose () d irgendwo sein. Ja, theres alle moglichen Weisen, die Sie im Fu? schie?en konnen, aber das ist nicht ein Drehbuch, das wir diskutierten. Ich wurde personlich schie?en alle Code ich so uberpruft. Das ware auf meiner nicht empfohlenen Liste. Freitag, 26. Oktober 2007 19:54 Wieder ist dieses nicht eine Ausnahme, die geworfen wird, also sehe ich keine Ausnahmedetails. Ich gehe nicht direkt in den catch-Block in meinem Code, ich wieder DIREKT nach dem Aufruf von WaitForExit (). Das Fenster, das ich empfange, ist das gleiche, das Sie erhalten, wenn jedes Microsoft-Produkt unerwartet schlie?t und MS Informationen uber den Crash will. Also wieder gibt es keine Ausnahme Details. Jedoch in einem der Systemprotokolle, bekomme ich eine mesage (ubersetzt aus Japanisch) quotDevenv. exe Anwendung erros auftreten, 8.0.50727.762 Version der Fehler aufgetreten msvcr80.dll-Modul, Version 8.0.50727.762, Fehler aufgetreten Adresse 0x00039001. Fur weitere Informationen, go. microsoft / fwlink/events. asp das Helo und Support Center bitte refer. quot Ich nahm an, dass Ihre Anwendung die Nachricht generierte (in diesem Fall sollten Sie immer eine Ausnahme und eine Stack-Trace erhalten), war es nicht klar, dass Sie Nach dem Aufruf von WaitForExit () fortsetzen. Es klingt fur mich wie die Anwendung youre lauft abnormal beendet. Fuhren Sie devenv. exe Im nicht sicher, was Sie in Ihrer Anwendung tun konnen, um eine andere Anwendung beenden abnormal zu stoppen. Anthony Maimone schrieb: Ich bin die Umleitung der Standard-Eingang, um in den verschiedenen Befehle in, weil ich hatte Schwierigkeiten bekommen sie zu arbeiten, wie ich wollte Form der StartInfo. Ich bin die Umleitung der Ausgabe-und Fehler-Streams zu uberprufen, was sie in ihnen haben, nachdem der Prozess beendet hat. Dies wird mir erlauben, fur alles, was ich mochte in jedem Stream, wenn wir fertig sind zu uberprufen. Ich auch nicht zulassen, entweder der Ausgang oder Fehler Umleitung Threads zu verbinden, bis nach dem Prozess hat den Aufruf von WaitForExit ubergeben. Ich bin vollig verstopft. Sie konnen eine Deadlock-Blockade, wenn Sie blockieren beim Lesen von und Anwendungen Standard-Ausgabe - die entsperren wurde, wenn Sie den Stream geschlossen, glaube ich. Das einzige, was ich denken kann, ist die Schaffung einer Anwendung, die auf dem Server ausgefuhrt wird und uberwachen Fenster, die Form der Prozesse, die Sie remote steuern und finden Sie dann die richtigen Schaltflachen und drucken Sie sie programmgesteuert eine Nachricht an die Nachricht Pumpe des Dialogfensters . Diese alos passiert mit Excel-, Wort-und anderen Anwendungen, die mit Autimation verwendet werden konnen MSFT nicht entwerfen diese Anwendungen ohne Benutzerinteraktion laufen, so dass einmal in eine Weile werden Sie Fenster auf Fehler erhalten. Haben Sie daruber nachgedacht, mit MSBuid, die mehr geeignet fur Batch-Builds ist, auch scheint es, dass in TFS 2008 Build-Server werden einfach zu bauen. Nun, ich versuchte, FindWindow und FindWindowEx zusammen mit SendMessage zu verwenden, aber ich konnte nicht das richtige Fensterhandle zu finden. Aber da ich wei?, dass eine Windows-Fehlermeldung Msssage-Box wird auftauchen, uberprufte ich, um zu sehen, ob es sein eigener Prozess (und es ist). Der Prozess ist dwwin. exe (Dr. Watson Win) und alles, was ich tun musste, war dies, damit ich das aktuelle Problem richtig zu bekommen. Ersetzen Sie den aktuellen Codeblock unten fur die WaitForExit () - Anweisung, die ich zuvor hatte. Proc. WaitForExit (60000) // eine Minute Prozess ProcArray Process. GetProcessesByName (quotdwwinquot) foreach (Prozess ProcessFound in ProcArray) Ich uberprufte auch, um zu sehen, wenn Sie in der Lage, die Process. MainWindowTitle () erhalten, aber es ist auf quotquot gesetzt. Also das ist ein Hack und ich mag es nicht, aber es funktioniert fur die aktuelle Ausfuhrung. Montag, 29. Oktober 2007 7:26 PMProcess. WaitForExit-Methode (Int32) WaitForExit (Int32) macht den aktuellen Thread, bis der zugehorige Prozess beendet wird. Es sollte aufgerufen werden, nachdem alle anderen Methoden auf den Prozess aufgerufen werden. Verwenden Sie das Ereignis Exited, um zu verhindern, dass der aktuelle Thread blockiert wird. Diese Methode weist die Prozesskomponente an, eine endliche Zeitspanne zu warten, bis der Prozess beendet wird. Wenn der zugeordnete Prozess nicht durch das Ende des Intervalls beendet wird, da die Anforderung zum Beenden verweigert wird, wird false an die aufrufende Prozedur zuruckgegeben. Sie konnen eine negative Zahl (unendlich) fur Millisekunden angeben. Und Prozess. WaitForExit (Int32) verhalt sich wie die WaitForExit () - Uberlastung. Wenn Sie 0 (Null) an die Methode ubergeben, gibt es nur true zuruck, wenn der Prozess bereits beendet wurde, es sofort false zuruckgibt. In. NET Framework 3.5 und fruhere Versionen, wenn Millisekunden -1 war, wartete der WaitForExit (Int32) Uberlast fur MaxValue Millisekunden (ca. 24 Tage), nicht auf unbestimmte Zeit. Wenn die Standardausgabe auf asynchrone Ereignishandler umgeleitet wurde, ist es moglich, dass die Ausgabeverarbeitung nicht abgeschlossen ist, wenn diese Methode zuruckgegeben wird. Um sicherzustellen, dass die asynchrone Ereignisbehandlung abgeschlossen ist, rufen Sie die WaitForExit () - Uberlastung auf, die nach dem Erhalt eines True von dieser Uberladung keinen Parameter ubernimmt. Legen Sie die SynchronizingObject-Eigenschaft fest, um sicherzustellen, dass das Exited-Ereignis in Windows Forms-Anwendungen ordnungsgema? behandelt wird. Wenn ein zugehoriger Prozess beendet wird (wird durch das Betriebssystem durch eine normale oder abnormale Beendigung beendet), speichert das System Verwaltungsinformationen uber den Prozess und kehrt zu der Komponente zuruck, die WaitForExit (Int32) aufgerufen hatte. Die Process-Komponente kann dann auf die Informationen zugreifen, zu denen auch die ExitTime gehort. Indem Sie den Handle fur den beendeten Prozess verwenden. Da der zugehorige Prozess beendet ist, weist die Handle-Eigenschaft der Komponente nicht mehr auf eine vorhandene Prozessressource hin. Stattdessen kann der Handle nur verwendet werden, um auf die Betriebssystem-Informationen uber die Prozessressource zuzugreifen. Das System ist sich bewusst, dass Handles fur verlassene Prozesse, die nicht von Process-Komponenten freigegeben wurden, bewahrt werden, sodass es die ExitTime - und Handle-Informationen im Speicher beibehalt, bis die Prozesskomponente die Ressourcen spezifisch freigibt. Wenn Sie Start fur eine Prozessinstanz aufrufen, rufen Sie deshalb Close auf, wenn der zugehorige Prozess beendet wurde und Sie keine Verwaltungsinformationen mehr benotigen. Schlie?e befreit den Speicher, der dem beendeten process. Hi zugewiesen wird, entwickle ich eine C-Konsolenanwendung, die eine Befehlszeile beginnt und einige Daten durch einen anderen Befehl erhalt (das in dieser Diskussion irrelevant ist). Irgendwann werde ich einige Daten in der Befehlszeile und ich brauche nur die letzte Zeile, die. Ich habe den folgenden Code verwendet: Process. StartInfo. FileName quotcmd. exequot Process. StartInfo. RedirectStandardInput true Process. StartInfo. RedirectStandardOutput true Ich habe Process. StandardInput. WriteLine verwendet, um die Befehle zu schreiben, die ich zur Konsole benotige. Aber wenn Process. StartInfo. RedirectStandardOutput true, ich bin nicht immer die gewunschte Ausgabe mit der Anweisung Process. StandardOutput. ReadToEnd (). Split (n), wahrend ReadLine Option funktioniert gut und ich bekomme die erste Zeile des Textes angezeigt. Da jedes Mal die Daten, die ich auf der Konsole unterscheide, unterscheiden sich, kann ich nicht hardcode jede spezifische Loaction von wo ich meine Ausgabe zu bekommen. Auch wenn ich eine Watch auf die Anweisung Process. StandardOutput. ReadToEnd (). Split (n) Ich erhalte eine Funktion Timeout-Ausnahme. Bitte helfen Sie mir mit diesem Problem. Donnerstag, 7. August 2008 5:44 Also habe ich Manjus-Code kopiert. Myprocesss quotcmd. exequot. Zuerst schickte ich den Befehl quotipconfigquot mit einem readToEnd () Timed out. Versuchtes Lesen in Blocken, scheiterte auch. Getestet waitForInputIddle (), aber vergessen, dass cmd keine grafische Schnittstelle hat, scheiterte auch. Also brauchte ich das cmd, um den Stream zu beenden, wenn ich es jemals lesen wollte. Ok so Ausfahrt Ich versuchte, alle meine Befehle zu senden, INKLUSIVE den Befehl exit, dann lesen. SIn. WriteLine (quotipconfigquot) sIn. WriteLine (quotipconfig / allquot) sIn. WriteLine (quotexitquot) string strOutPut sOut. ReadToEnd () Funktioniert wie ein Zauber. Meine ReadToEnd () gibt einen String in einer halben Sekunde, und ich bekam alle Informationen, die ich brauche. -) Das konnte Ihnen helfen, Gauri. Das Unwahrscheinliche, das Unmogliche dauert nur ein wenig langer. - Steven Parker Marked als Antwort von Jack 321 Montag, 11. August 2008 07:51 ReadToEnd () ist geeignet, Deadlock verursachen, vor allem, wenn Sie es nach einem WaitForExit () oder senden Eine Menge von Input. Der Prozess schreibt seine Ausgabe in einen Puffer, der Puffer ist nicht sehr gro? (2KB denke ich). Es Sie nicht lesen den Inhalt dieses Puffers, sagen wiith ReadLine (), wird der Prozess abwarten, warten, bis der Puffer geleert werden. Ihr Programm wird abgebrochen, da WaitForExit () nie zuruckkehren wird, oder der WriteLine () - Aufruf wird gestoppt, da der Prozess nicht mehr gelesen wird. Wenn das dein Szenario ist, musst du asynchron mit BeginOutputReadLine () lesen. Hans Passant. Antwort # 2 am: April 12, 2008, 06:12:50 pm »Sie mussen auch Process. StartInfo. UseShellExecute auf false gesetzt. Als Antwort markiert von jack 321 Montag, August 11, 2008 5:43 AM Die oben ist eine sehr schone Standard-Antwort, aber. Ich denke nicht, dass das quotcmdquot den Stream beendet. Von der cmd-Box wird nichts gesendet, um anzuzeigen, dass der Stream beendet wird. Betrachten Sie eine Webseite, die Sie laden, sobald der gesamte HTML-Code Ihren PC erreicht hat, ist der Stream fertig. Das gleiche beim Lesen einer Datei, sobald Sie das letzte Zeichen erreicht haben, ist der Stream fertig. Allerdings mit cmd, ist der Stream nicht quotdonequot. Es wartet nur auf neue Eingabe, dann, wenn Sie ihm einen anderen Befehl geben, wird es Ausgabe wieder haben. Hmm Ich scheine, Probleme zu haben, mich in Englisch wieder auszudrucken, meine Entschuldigungen. Anyways, I dont think theres alles, was Sie tun konnen, um ReadToEnd () auf einem cmd-output-stream verwenden, es sei denn, Sie senden es den Befehl quotexitquot. Haben Sie versucht, die readline () mit einem kombinieren. Eine Analyse der Linie (d. H. Erhalten Sie leere Zeilen) oder b. Den Process. WaitForIddleInput () - Befehl Das Unwahrscheinliche tun wir, das Unmogliche dauert nur ein wenig langer. - Steven Parker Donnerstag, August 07, 2008 7:35 AM Wenn Sie cmd Prozess laufen. Remeber, um quotEXITquot in Eingabestream zu schreiben Thursday, August 07, 2008 7:51 AM Also habe ich Manjus-Code kopiert. Myprocesss quotcmd. exequot. Zuerst schickte ich den Befehl quotipconfigquot mit einem readToEnd () Timed out. Versuchtes Lesen in Blocken, scheiterte auch. Getestet waitForInputIddle (), aber vergessen, dass cmd keine grafische Schnittstelle hat, scheiterte auch. Also brauchte ich das cmd, um den Stream zu beenden, wenn ich es jemals lesen wollte. Ok so Ausfahrt Ich versuchte, alle meine Befehle zu senden, INKLUSIVE den Befehl exit, dann lesen. SIn. WriteLine (quotipconfigquot) sIn. WriteLine (quotipconfig / allquot) sIn. WriteLine (quotexitquot) string strOutPut sOut. ReadToEnd () Funktioniert wie ein Zauber. Meine ReadToEnd () gibt einen String in einer halben Sekunde, und ich bekam alle Informationen, die ich brauche. -) Das konnte Ihnen helfen, Gauri. Das Unwahrscheinliche, das Unmogliche dauert nur ein wenig langer. - Steven Parker Marked als Antwort von Jack 321 Montag, 11. August 2008 07:51 ReadToEnd () ist geeignet, Deadlock verursachen, vor allem, wenn Sie es nach einem WaitForExit () oder senden Eine Menge von Input. Der Prozess schreibt seine Ausgabe in einen Puffer, der Puffer ist nicht sehr gro? (2KB denke ich). Es Sie nicht lesen den Inhalt dieses Puffers, sagen wiith ReadLine (), wird der Prozess abwarten, warten, bis der Puffer geleert werden. Ihr Programm wird abgebrochen, da WaitForExit () nie zuruckkehren wird, oder der WriteLine () - Aufruf wird gestoppt, da der Prozess nicht mehr gelesen wird. Wenn das dein Szenario ist, musst du asynchron mit BeginOutputReadLine () lesen. Hans Passant. Als Antwort markiert von Jack 321 Montag, 11. August 2008 05:44 Uhr Microsoft fuhrt eine Online-Umfrage durch, um Ihre Meinung uber die Msdn-Website zu verstehen. Wenn Sie sich fur die Teilnahme entscheiden, wird Ihnen die Online-Umfrage prasentiert, wenn Sie die Msdn-Website verlassen. Mochten Sie teilnehmen