Hallo zusammen.
Ja, ich hab schon gegoogelt und ja, ich hab auch schon Antworten verschiedenster Art gefunden und ausprobiert: mit dem gleichen "Erfolg" --> es hat nicht funktioniert!
Ich habe eine Win-Forms-Anwendung, aus der ich einen Batch in eigenem Prozess aufrufe:
private void runProcessThread()
{
System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("halloWelt.bat");
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = false;
procStartInfo.RedirectStandardOutput = true;
p = new System.Diagnostics.Process();
p.StartInfo = procStartInfo;
p.EnableRaisingEvents = true;
p.Exited += new EventHandler(p_Exited);
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.Start();
p.BeginOutputReadLine();
}
p ist "global" als Prozess deklariert!!! Der aufgerufene Batch gibt lediglich 3 Zeilen nach einander auf der Windows-Console aus, mit jeweils einer Sekunde Pause dazwischen!!!Wenn ich den Batch direkt aus der Win-Console aus aufrufe, dann funktioniert alles einwandfrei!
Wie ihr sicherlich sehen könnt will ich meine Ausgabe umleiten:
procStartInfo.RedirectStandardOutput = true;
p.EnableRaisingEvents = true;
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.BeginOutputReadLine();
im p_OutputDataReceived-Handler will ich e.Data.ToString() einfach mal in der Console ausgeben!
private void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if(e.Data != null)
Console.WriteLine(e.Data.ToString());
//throw new NotImplementedException();
}
und jetzt kommts: Es geht nicht so wie ich es gerne hätte!!! Wie schon erwähnt gibt der Batch mir Zeilenweise mit einer Sekunde Abstand 3 Zeilen aus. So würde ich es auch erwarten, wenn ich den Batch via C# aus aufrufe. Wenn ich die Standardausgabe (procStartInfo.RedirectStandardOutput = false;) hernehme, dann zeigt es mir die Daten wie gewünscht im hochpoppenden Windows-Consolenfenster an, Zeile für Zeile mit Pause dazwischen. Aktiviere ich die Umleitung, habe ich das Problem, dass der Prozess erst bis zum Ende abgearbeitet wird und ERST DANN mir die Ausgabe machtgemacht wird...!!! Und zwar auf einmal und nicht mit einem Delay von jeweils 1 Sek!!!
Ich habs schon mit verschiedenen Threads versucht, hab schon mit dem oben zu sehenden EventHandler gearbeitet und hab auch schon mit Deligates gearbeitet (s. unten)... ALLES OHNE ERFOLG. Ich verstehs nicht :(
Dummerweise kann ich nicht zB. 5 Min warten, bis der Prozess abgearbeitet ist, sondern muss eventuelle Fehler oder Werte gleich haben und angezeigt bekommen, eben synchron!!!
PLS HELP !!!
if (fileName != null)
{
Thread tRunProcess = new Thread(new ThreadStart(runProcessThread)); //runProcessThread wie oben im schon zu sehen
Thread tResultOutput = new Thread(new ThreadStart(resultOutput));
tRunProcess.Start();
// sleep this thread untill process is initialized
while (p == null)
Thread.Sleep(100);
tResultOutput.Start();
}
else
{
MessageBox.Show("Please open first a file", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
private void resultOutput()
{
StreamReader output = p.StandardOutput;
string str;
while ((str = output.ReadLine()) != null)
{
Console.WriteLine(str);
SetTextOutput(str);
}
}
delegate void SetTextOutputCallback(string text);
private void SetTextOutput(string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.InvokeRequired)
{
SetTextOutputCallback d = new SetTextOutputCallback(SetTextOutput);
this.Invoke(d, text);
}
else
{
textBox1.Text += text + Environment.NewLine;
}
}