アプリケーション(Googleマップのようなもの)を作成し、デバッグデータが書き込まれるテキストボックスフィールドを追加しました(もちろん、後で削除するつもりでした)。興味深い事実は、それが「いっぱい」になった後、数キロバイトとしましょう。プログラム全体が大幅に遅くなり、プログラムを操作できなかったために終了する必要がありました。
説明してもらえますか?
アプリケーション(Googleマップのようなもの)を作成し、デバッグデータが書き込まれるテキストボックスフィールドを追加しました(もちろん、後で削除するつもりでした)。興味深い事実は、それが「いっぱい」になった後、数キロバイトとしましょう。プログラム全体が大幅に遅くなり、プログラムを操作できなかったために終了する必要がありました。
説明してもらえますか?
まあ、それは確かに数キロバイト以上です。しかし、はい、TextBoxはトレース情報を表示するためのコントロールとしてはかなり不適切です。新しい行を追加するたびに、内部バッファを再割り当てして、古いテキストを新しいテキストにマージする必要があります。これは、 .NETのStringクラスとまったく同じ種類の問題です。回避策としてStringBuilderクラスを使用しますが、TextBoxに相当するものはありません。
多くの行を追加するときにTextBoxを非常に遅くする別のオプションは、WordWrapプロパティです。Trueに設定すると、ペイントするたびに各行の長さを把握するために多くの作業を行う必要があります。
したがって、回避策は、WordWrapをFalseに設定したままにし、長さが制限に達するたびにテキストの半分を破棄することで、テキストの量が際限なく増えるのを防ぐことです。または、別のコントロールを使用することにより、トレースデータを編集する意味がないため、TextBoxはとにかくあまり適していません。ListBoxのように。
一度に少しのデータを追加する代わりに、例えば:
debugTextBox.Text += "Some new debug info"
おそらく、この戦略はより速いかもしれません:
StringBuilder debugText = new StringBuilder();
...
debugText.Append("Some new debug info");
debugTextBox.Text = debugText.ToString();
(これStringBuilder
にはおそらくやり過ぎであり、文字列の連結を直接操作するよりも遅くなる可能性がありますstring debugText
)