Dzięki Pablo8. Wykorzystanie zdarzenia "Exited" obeszło problem. Ale i tak nie rozumiem czemu poniższy kod działa w 100%, tzn.: Proces się kończy. W związku z czym "WaitForExit() też się kończy i nie blokuje niczego. Wyjście standardowe procesu zostaje skopiowane do richTextBox oraz wyświetla się "messageBox" generowany w zdarzeniu "Exited"
using System;
using System.Windows.Forms;
namespace DISMassistant
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
process1.StartInfo.RedirectStandardError = true;
process1.StartInfo.RedirectStandardOutput = true;
process1.StartInfo.UseShellExecute = false;
process1.StartInfo.FileName = "cmd.exe";
process1.StartInfo.Arguments = "/?";
test();
}
public void test()
{
process1.Start();
process1.BeginOutputReadLine();
process1.BeginErrorReadLine();
process1.WaitForExit();
process1.CancelOutputRead();
process1.CancelErrorRead();
process1.Close();
}
private void process1_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
if (string.IsNullOrEmpty(e.Data)) return;
if (richTextBox1.InvokeRequired)
{
richTextBox1.Invoke((MethodInvoker)delegate { richTextBox1.Text += e.Data + "\n"; });
}
else
{
richTextBox1.Text += e.Data + "\n";
}
}
private void process1_ErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
if (string.IsNullOrEmpty(e.Data)) return;
if (richTextBox1.InvokeRequired)
{
richTextBox1.Invoke((MethodInvoker)delegate { richTextBox1.Text += e.Data + "\n"; });
}
else
{
richTextBox1.Text += e.Data + "\n";
}
}
private void process1_Exited(object sender, EventArgs e)
{
process1.CancelOutputRead();
process1.CancelErrorRead();
MessageBox.Show("Proces zakończył się");
}
}
}
Natomiast w poniższym kodzie proces nie kończy się, dlatego wykonanie programu zatrzymuje się na "WaitForExit()", i nawet formularz się nie wyświetla. Różnica między kodami jest taka, że w pierwszym przypadku wywołuję metodę "test()" w konstruktorze klasy "Form1", a w drugim w zdarzeniu "Load" formularza.
using System;
using System.Windows.Forms;
namespace DISMassistant
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
process1.StartInfo.RedirectStandardError = true;
process1.StartInfo.RedirectStandardOutput = true;
process1.StartInfo.UseShellExecute = false;
process1.StartInfo.FileName = "cmd.exe";
process1.StartInfo.Arguments = "/?";
}
private void Form1_Load(object sender, EventArgs e)
{
test();
}
public void test()
{
process1.Start();
process1.BeginOutputReadLine();
process1.BeginErrorReadLine();
process1.WaitForExit();
process1.CancelOutputRead();
process1.CancelErrorRead();
process1.Close();
}
private void process1_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
if (string.IsNullOrEmpty(e.Data)) return;
if (richTextBox1.InvokeRequired)
{
richTextBox1.Invoke((MethodInvoker)delegate { richTextBox1.Text += e.Data + "\n"; });
}
else
{
richTextBox1.Text += e.Data + "\n";
}
}
private void process1_ErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
if (string.IsNullOrEmpty(e.Data)) return;
if (richTextBox1.InvokeRequired)
{
richTextBox1.Invoke((MethodInvoker)delegate { richTextBox1.Text += e.Data + "\n"; });
}
else
{
richTextBox1.Text += e.Data + "\n";
}
}
private void process1_Exited(object sender, EventArgs e)
{
process1.CancelOutputRead();
process1.CancelErrorRead();
MessageBox.Show("Proces zakończył się");
}
}
}