Guten Tag,
Ich versuche, mittels Process ein Programm (namentlich
Mit folgendem Befehl (unter Linux (Ubuntu) mit bash) funktioniert das:
(Ist nach unter einer halben Sekunde fertig)
Kurz aufgeschlüsselt:
Ich habe (mit meinen doch sehr eingeschränkten Kentnissen zum Thema Process) dann folgenden Test-Code aufgebaut,
die Betonung liegt auf
Das Programm scheint jedoch nie zu beenden, und gibt keine Daten im StdOut aus.
Nach einigerZeit auf StackOverflow Recherche, mit dem Zwischenergebnis "Wenn ich den Stream nicht lese gibt es einen Deadlock" bin ich dann bei folgendem Code gelandet (Auch wenn ich nicht verstehe, was das AutoResetEvent hier helfen soll - werde mal Nachforschen):
Spoiler anzeigen
Hier passiert jedoch genau das gleiche... das Programm eendet nicht und gibt nichts in StOut.
Ich habe mich nun entschieden, diesen gesammten Code einfach in die Tonne zu hauen, und es neu zu machen.
Kann/Möchte mir jemand erläutern, wie ich dies umsetzen kann, oder mir sagen, was genau ich falsch Mache
Grüße
Ich versuche, mittels Process ein Programm (namentlich
Inkscape
) zu starten, und via StandardInput und StandardOutput Daten damit auszutauschen.Mit folgendem Befehl (unter Linux (Ubuntu) mit bash) funktioniert das:
cat assets/resources/svg/input.svg | inkscape --export-type="png" --pipe --export-filename=- 2> /dev/null >out/out.png
.(Ist nach unter einer halben Sekunde fertig)
Kurz aufgeschlüsselt:
cat
liest die Datei assets/resources/svg/input.svg
und schickt sie an den StdIn von inkscape
, welches auf seinem StdOut wiederrum Daten ausgibt, die dann in out/out.png
geschrieben werden. StdErr wird hierbei einfach verworfen.Ich habe (mit meinen doch sehr eingeschränkten Kentnissen zum Thema Process) dann folgenden Test-Code aufgebaut,
die Betonung liegt auf
Test
C#-Quellcode
- using (var reader = new StreamReader(@"assets/resources/svg/input.svg"))
- using (var memory = new MemoryStream())
- using (var memoryWriter = new StreamWriter(memory))
- using (var proc = new Process
- {
- StartInfo = new ProcessStartInfo("inkscape", "--export-type=\"png\" --export-filename=- --pipe")
- {
- RedirectStandardOutput = true,
- RedirectStandardInput = true
- }
- })
- {
- proc.Start();
- proc.BeginOutputReadLine();
- //Datei einlesen und an Programm übergeben
- proc.StandardOutput.DiscardBufferedData();
- await proc.StandardInput.WriteAsync(await reader.ReadToEndAsync());
- await proc.StandardInput.FlushAsync();
- proc.WaitForExit(5_000); //Max 5 Sekunden
- //Bis hierher kommen wir noch
- await memoryWriter.WriteAsync(await proc.StandardOutput.ReadToEndAsync());
- //Hierher kommen wir nicht....
- }
- }
Das Programm scheint jedoch nie zu beenden, und gibt keine Daten im StdOut aus.
Nach einiger
C#-Quellcode
- using (var reader = new StreamReader(@"assets/resources/svg/input.svg"))
- using (var memory = new MemoryStream())
- using (var memoryWriter = new StreamWriter(memory))
- using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false))
- {
- using (Process process = new Process
- {
- StartInfo = new ProcessStartInfo("inkscape", "--export-type=\"png\" --export-filename=- --pipe")
- {
- RedirectStandardOutput = true,
- RedirectStandardInput = true
- }
- })
- {
- try
- {
- process.OutputDataReceived += (sender, e) =>
- {
- if (e.Data == null)
- {
- outputWaitHandle.Set();
- }
- else
- {
- memoryWriter.WriteLine(e.Data);
- }
- };
- process.Start();
- process.StandardInput.Write(reader.ReadToEnd());
- process.StandardInput.Flush();
- process.BeginOutputReadLine();
- if (process.WaitForExit(5_0000))
- {
- // Kein Timeout
- logger.Info("LÄUFT");
- }
- else
- {
- // Timeout
- logger.Info("TIMEOUT");
- }
- }
- finally
- {
- outputWaitHandle.WaitOne(100);
- }
- }
- memoryWriter.Flush();
- memory.Position = 0;
- //Hier stream lesen
- }
Hier passiert jedoch genau das gleiche... das Programm eendet nicht und gibt nichts in StOut.
Ich habe mich nun entschieden, diesen gesammten Code einfach in die Tonne zu hauen, und es neu zu machen.
Kann/Möchte mir jemand erläutern, wie ich dies umsetzen kann, oder mir sagen, was genau ich falsch Mache
Grüße
こんにちわ
Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.
Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.