Я написал приложение на c # для запуска внешней программы и перенаправил его вывод в richtextbox в моей форме. Я создал процесс, используя следующие настройки
p1.StartInfo.RedirectStandardOutput = true;
p1.OutputDataReceived += new DataReceivedEventHandler(outputreceived);
и в полученном событии
void outputreceived(object sender, DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data))
{
richTextBox1.Invoke(new UpdateOutputCallback(this.updateoutput),
new object[] { e.Data });
}
}
void updateoutput(string text)
{
int len = text.Length;
int start = richTextBox1.Text.Length;
richTextBox1.Text += text + Environment.NewLine;
richTextBox1.Select(start, len);
richTextBox1.SelectionColor = System.Drawing.Color.White;
richTextBox1.Select(richTextBox1.Text.Length, 0);
richTextBox1.ScrollToCaret();
}
Теперь, хотя дело в том, что оно работает, но моя основная форма, которая содержит текстовое поле, зависает, если вывод огромен из приложения. Я думаю, что каждый раз вызов invoke приводит к перерисовке формы, что происходит очень часто. Есть ли альтернатива, чтобы я мог видеть обновления текстового поля по мере их появления, а также сохранять форму полностью активной?
<ч />
Обновление:
Я думаю, что получил ответ, я использовал BeginInvoke
, когда я должен был использовать Invoke
.
<Ч />
Обновление 1:
Я пробовал и BeginInvoke, и Suspendlayout, но это не дает мне желаемой функциональности, происходит то, что процесс восстанавливает весь стандартный вывод в строку, но поток, отвечающий за обновление текста, тратит свое время на распечатать данные. Могу ли я сделать что-нибудь с этим?