Monday 8 May 2017

Waitforexit Wartet Nicht Auf Anführungszeichen


C 3.5 Winforms App. Ich habe einen Timer, der alle 30 Sekunden auf separaten Thread ausbricht (alles, was es tut, ist eine Textfolge an das VS-Ausgabefenster zu schreiben). Ich habe auch noch einen Thread, der auf einen bestimmten Prozess wartet, wenn er anfängt. Zum Beispiel winword. exe. In diesem Thread habe ich diesen Code: Und es wird dort sitzen und warten auf winword. exe zu beenden. Das geht gut Allerdings, während es dort sitzt und wartet auf winword. exe zu beenden, der 30 Sekunden Timer auf einem völlig separaten Thread (der Text an das Ausgabefenster sendet) läuft nie. Wenn ich 3 Minuten abwarte (also der andere Timer sollte 6 mal an diesem Punkt laufen, aber es geht nicht, während WaitForExit () wartet), und dann gebe ich winword. exe ganz plötzlich mein anderer Timer startet 6 mal auf einmal . Es ist wie es ist ein Rückstand der Timer-Event und plötzlich will es alles zur gleichen Zeit laufen. Warum schlägt p. WaitForExit () meine ganze Anwendung zu blockieren, obwohl ich es von einem separaten Thread in meiner App ausführen kann (nicht der Haupt-UI-Thread) Bearbeiten: Ja, es ist in einem separaten Thread. Hier ist der Code, den ich benutze, um ihn zu starten: Hier ist die ProcessCheck () Methode, die ich habe: Du hast die richtige Idee Peter, falsche Erklärung. Aufruf von Control. Invoke führt den angegebenen Delegierten auf dem UI-Thread aus und blockiert den aufrufenden Thread, bis der UI-Thread seine Ausführung beendet hat. Was in dem oben genannten Code passiert ist, ist, dass p. WaitForExit sowohl den UI-Thread (weil seine Ausführung auf dem UI-Thread) und den aufrufenden Thread (der auf den UI-Thread wartet) blockiert. Ndash Tergiver Jul 30 12 um 17:49 fraXis Du kannst BeginInvoke benutzen, aber das würde WaitForExit immer noch auf den UI-Thread aufrufen und ihn blockieren. Wenn der Code, der gerade Aufruf aufruft, in einem Hintergrund-Thread ist, kannst du WaitForExit direkt anrufen, wodurch der Hintergrund-Thread anstelle des UI-Threads blockiert wird. Wenn Sie etwas mehr Details darüber, was you39re wirklich versuchen zu tun, jemand könnte in der Lage, mehr Details zu liefern. Ndash Peter Ritchie Jul 30 12 um 17: 52Elina: Danke für deine Antwort. Es gibt einige Notizen am unteren Rand dieses MSDN-Dokuments (msdn. microsoften-uslibraryhellip), die über potenzielle Deadlocks warnen, wenn Sie bis zum Ende der beiden umgeleiteten Stdout - und Stderr-Ströme synchron lesen. Es ist schwer zu sagen, ob Ihre Lösung anfällig für dieses Problem ist. Außerdem scheint es, dass du die process39 stdoutstderr Ausgabe direkt als Eingang sendest. Warum. ) Ndash Matthew Piatt Sep 26 16 at 4:42 Dies ist eine modernere, aufwartende, Task Parallel Library (TPL) basierte Lösung für 4.5 und höher. Usage Beispiel Implementierung beantwortet 5. Oktober 16 um 10:54 Ich Ding, dass dies ist einfach und besser Ansatz (wir brauchen nicht AutoResetEvent) Antwort # 2 am: Mai 18, 2010, 07:13:13 am »True, aber shouldn39t Sie tun. FileName Pfad quotggsci. exequot quot lt Obeycommand. txtquot, um Ihren Code zu vereinfachen oder vielleicht etwas gleichbedeutend mit quotecho Befehl path quotggsci. exequot wenn Sie wirklich don39t wollen eine separate obeycommand. txt Datei verwenden. Ndash Amit Naidu Jun 3 13 at 22:03 Deine Lösung braucht nicht AutoResetEvent, aber du zählst. Wenn du anstelle von Event-Event (wenn sie verfügbar sind), dann sind Sie mit CPU ohne Grund und das deuten darauf hin, dass Sie ein schlechter Programmierer sind. Ihre Lösung ist wirklich schlecht, wenn mit dem anderen mit AutoResetEvent verglichen. (Aber ich habe dir nicht gegeben, weil du versucht hast zu helfen). Ndash Eric Ouellet Nov 7 14 at 18:38 Ich hatte das gleiche Problem, aber der Grund war anders. Es würde aber unter Windows 8 passieren, aber nicht unter Windows 7. Die folgende Zeile scheint das Problem verursacht zu haben. Die Lösung bestand darin, UseShellExecute NICHT zu deaktivieren. Ich habe jetzt ein Shell Popup-Fenster, das ist unerwünscht, aber viel besser als das Programm wartet auf nichts Besonderes passieren. So fügte ich das folgende Work-around hinzu: Jetzt das einzige, was mich stört, ist, warum dies geschieht unter Windows 8 an erster Stelle. Antwortete 13. Januar 15 um 10:35 Ich habe versucht, eine Klasse, die Ihr Problem mit asynchronen Stream zu lösen, zu lesen, indem Sie in Rechnung Mark Byers, Rob, stevejay Antworten zu machen. So erkannte ich, dass es einen Fehler gibt, der mit dem asynchronen Prozessausgangsstrom verknüpft ist. Du kannst das nicht tun: Du erhältst System. InvalidOperationException. StandardOut wurde nicht umgeleitet oder der Prozess hat noch nicht begonnen. Dann müssen Sie die asynchrone Ausgabe starten, nachdem der Prozess gestartet wurde: So machen Sie eine Racebedingung, da der Ausgabestream Daten empfangen kann, bevor Sie ihn auf asynchron einstellen: Dann könnten einige Leute sagen, dass Sie nur den Stream vor Ihnen lesen müssen Setze es asynchron an. Aber das gleiche Problem tritt auf. Es wird eine Race-Bedingung zwischen dem synchronen Lesen und setzen den Stream in den asynchronen Modus. Es gibt keinen Weg, um sicheres asynchrones Lesen eines Ausgabestreams eines Prozesses in der tatsächlichen Weise zu bewirken, dass Process und ProcessStartInfo entworfen wurden. Sie sind wahrscheinlich besser mit asynchronen lesen wie vorgeschlagen von anderen Benutzern für Ihren Fall. Aber Sie sollten sich bewusst sein, dass Sie aufgrund der Rennbedingung einige Informationen verpassen könnten.

No comments:

Post a Comment