外部プログラムを実行するための ac# アプリケーションを作成し、その出力をフォームのリッチテキスト ボックスにリダイレクトしました。次の設定を使用してプロセスを作成しました
p1.StartInfo.RedirectStandardOutput = true;
p1.OutputDataReceived += new DataReceivedEventHandler(outputreceived);
そして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();
}
今は機能していますが、アプリケーションからの出力が膨大な場合、テキストボックスを含むメインフォームがハングします。インボーク呼び出しがフォームの再描画につながるたびに、これは非常に頻繁に発生すると思います。テキストボックスの更新が発生したときにそれを確認し、フォームを完全にアクティブに保つための代替手段はありますか?
アップデート:
私は自分の答えを得たと思いBeginInvoke
ますInvoke
。
更新 1:
BeginInvoke と Suspendlayout の両方を試しましたが、必要な機能が得られません。プロセスがすべての標準出力を文字列に戻したのですが、テキストの更新を担当するスレッドがデータを出力するのに時間がかかっています。 . 何かできることはありますか?