Elina: 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 zu machen, die dein Problem mit asynchronem Stream lösen würde, indem du in Berücksichtigung von Mark Byers, Rob, stevejay antwortet. 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 du solltest dir bewusst sein, dass du wegen Rennbedingung einige Informationen vermissen kannst. Ich sehe seltsame Fehler bei der Ausführung einer Befehlszeile aus einem Windows-Dienst mit Process. Das folgende Code-Snippet ähnelt dem Code in Frage: public static void RunCommandLine (String-Befehl) Prozessprozess null try ProcessStartInfo processInfo new ProcessStartInfo (quotcmd. exequot, quotC quot Befehl) processInfo. CreateNoWindow true processInfo. WindowStyle ProcessWindowStyle. Hidden processInfo. UseShellExecute False processInfo. RedirectStandardOutput true processInfo. LoadUserProfile true Prozess new Prozess () process. StartInfo processInfo process. Start () process. EnableRaisingEvents true process. OutputDataReceived new DataReceivedEventHandler (processOutputDataReceived) catch (Exception ex) statisch void processOutputDataReceived (Objektsender, DataReceivedEventArgs e) Der Code funktioniert gut, wenn mit einem Konsolenfenster implementiert, aber fehlschlägt, wenn in einem Windows-Dienst. Das Folgende kann ausgeschlossen werden, da die Dinge, die ich bereits versucht habe, den Service als ein Konto mit größeren Privilegien ausführen, die den Allow-Dienst festlegen, um mit dem Desktop-Versorgungs-Vollpfad zu interagieren. Ich habe das Problem auf RedirectStandardOutput zurückverfolgt, wenn irgendein Ansatz zur Umleitung der Standardausgabe ist Implementiert (ich habe auch versucht. StandardOutput. ReadToEnd () und Laich ein separates Thread etc) der Befehl (oder eher ausführbare, die aufgerufen wird) fehlschlägt. Es hat fast sicher mit der Fenster-Service-Umgebung zu tun (oder fehlt davon), wie das Ausführen des Rohbefehls in einem cmd-Fenster funktioniert, und das oben in einem Konsolenfenster funktioniert auch Die Frage ist, was genau muss ich tun, um die Konsole zu replizieren () CreateEnvironmentBlock () CreateUnieUnterstützung () CreateUnieProfile () CreateUcessAsUser () CreateProcessAsUser () DestroyEnvironmentBlock () UnloadUserProfile () RevertToSelf () Kann. Ich kann es sein, dass du alle folgenden nicht verwalteten Codes benutzt hast: LogonUserEx () ImpersonateLoggedOnUser () Jeder bestätige dies, um richtig zu sein Jede Hilfe sehr geschätzt. Ich laufe auf XP Server2003. Der Fehler ist ein dunkler Fehler, der spezifisch für die ausführbare Datei ist, so dass keine Ausnahmen ausgelöst werden und der Prozess () existiert wie erwartet, aber der Prozess. ExitCode zeigt einen Fehler an. Weil ich den Stdout über OutputDataRecieved erfasse, sehe ich den genauen Fehler. Was ich nicht vorbei kann, ist, dass der Code, der die Exe anruft, ganz gut funktioniert, wenn er von der Konsole aus aufgerufen wird. Klar, was auch immer die Exe versucht zu tun, hat es entweder nicht genügend Erlaubnis zu tun. Oder Mangel an Umwelt Samstag, Dezember 06, 2008 2:27 AM Microsoft führt eine Online-Umfrage, um Ihre Meinung über die Msdn-Website zu verstehen. Wenn Sie sich für eine Teilnahme entscheiden, wird Ihnen die Online-Umfrage vorgestellt, wenn Sie die Msdn-Website verlassen. Möchten Sie teilnehmen?
No comments:
Post a Comment