文字をたくさん読んで、テキストボックスを更新
質問
私は(プロセスによって提供された)ストリーム文字単位からデータを読み込み、ユーザーが見ることができるようにテキストボックスに追加しています。唯一の問題は、これはのの SLOWである、です。それはプログラム(遅延なしに少しで)に与えられているように、ユーザがデータを参照する必要があります。私はそれはそれはぼかしだと非常に高速でスクロールすることができ、端末がテキストを処理する方法のような何かをしたいと思います。
私はこれをどのように改善することができますか?
参考のために、私はC#の.net3.5とのWinFormsを使用しています。
解決
テキストボックスのText
プロパティは、文字列で、文字列は(あなたが文字列を変更することはできませんことを意味する)不変です。これは、あなたが文字を追加するたびに、あなたが最後に追加1文字の文字列の新しいコピーを作成することを意味します。
、あなたは次の文字を追加するために、データの20kBとするコピーされます。一度に百文字1を追加すると、データのコピーを2メガバイトを意味します。
あなただけのキャラクターを追加するときに、最後の行を更新する必要がなるようにデータがラインベースである場合は、代わりに、テキストボックスの一覧を使用します。
他のヒント
複数行のテキストボックスでは、文字を追加するために選択を使用して、わずかに良いパフォーマンスが得られます。
textBox1.Select(textLength, 0);
textBox1.Selectedtext = newText;
textLength += newText.Length;
しかし、あなたは長さを自分で追跡する必要があります見ることができますし、(バックスペースのように)制御文字を許可する場合は、この方法はおそらく壊れるようます。
私が最初にリストボックスを使用してのGuffaのアイデアをお勧めします。
いくつかのコードがボトルネックになっているかを把握するのに役立つだろう。
私は(私はここでそれをテストすることはできませんように私は、コピー/貼り付けを示唆しています)これらの線に沿って何かをしようと思い、言った:
// Stream s...
byte[] buffer = new buffet[bufferSize];
s.BeginRead(b, 0, buffer.Length,
delegate
{
if (textBox1.InvokeRequired)
{
textBox1.Invoke(
new MethodInvoker(
delegate
{
textBox1.Text = Encoding.Unicode.GetString(b);
}));
}
else
{
textBox1.Text = Encoding.Unicode.GetString(b);
}
}, null);