2012-12-26 2 views
6

私は、テキストボックスとデータグリッドビューを含むWindowsフォームを持っています。テキストボックスのテキストが変更されるとすぐに、datagridviewのデータソースが更新されます。これは、テキストボックスのTextChangedイベントを処理し、データソースに新しいListなどを割り当てることによって行われます。通常、新しいデータソースには1000行以上のデータが含まれています。また、このリストをフェッチするようにDBに照会することも時間がかかる。DataGridViewのマジック

私が驚くほど驚くべきことは、テキストボックスに十分速く入力すると、データグリッドは何度もレンダリングを中断し、最終結果のみをレンダリングすることです。真ん中の結果は完全に無視されます。連続したテキストの変更中に実行中のUIスレッドがビジーであるため、これは意味があります。しかし、なぜ私はまだテキストボックスに入力することができますか?

  1. TextChange
  2. データのフェッチ
  3. リフレッシングのDataGridView(レンダリング/塗装なし)
  4. TextChange
  5. データのフェッチ
  6. リフレッシングのDataGridView(レンダリング/塗装なし)
  7. ... TextChange
  8. データを取得中
  9. DataGridViewのリフレッシュ(最終的なレンダリング/ペインティング)
  10. 完了。

テキストボックスが別のスレッドにあったようですが、絶対にそうではありません。なぜ誰が知っていますか?

答えて

6

これはDataGridViewに固有のものではなく、Windowsウィンドウには自動的にこの機能があります。 メッセージキューによって提供されます。これは、ウィンドウを表示するスレッドに関連付けられたデータ構造です。スレッドが何か他のことをやっているとき、Windowsは、マウスボタンのクリックやキーボードのキーの押下などの入力イベントでキューにメッセージを追加します。

スレッドは、実行中の処理が終了すると、メッセージループ(Application.Run()によって開始されたもの)に再び入り、キューからメッセージを取り出して処理します。どちらのターンでTextChangeイベントが発生します。だから、キューを視覚化する良い方法は、バッファーです。デフォルトで最大10,000件のイベントを保存できます。

+0

これは本当です。しかし、なぜテキストボックスが実際に入力メッセージを処理するのですか(キー押下メッセージ)、dgvは各キー入力後に自身をレンダリングしませんか? – Alireza

+1

ペイントメッセージは優先順位の低いメッセージで、キューが空の場合にのみ配信されます。 –

+0

ありがとうハンス。 UIスレッド、メッセージループ、メッセージの優先度について詳しく知りたい。あなたの名前を参考にしてください。 – Alireza

関連する問題