6

テキストボックスとデータグリッドビューを含む Windows フォームがあります。テキストボックスのテキストが変更されるとすぐに、datagridview のデータソースが更新されます。たとえば、テキストボックスの TextChanged イベントを処理し、データソースに新しいリストを割り当てることによって行われます。通常、新しいデータソースには 1000 行以上のかなり大量のデータが含まれます。また、このリストを取得するために DB にクエリを実行するのにも時間がかかります。

驚いたことに、テキスト ボックスにすばやく入力すると、データグリッドはレンダリング自体を何度も中断し、最終結果のみをレンダリングします。中間結果は完全に無視されます。実行中の UI スレッドは連続したテキストの変更中にビジーになるため、これは理にかなっています。しかし、なぜテキストボックスに入力できるのでしょうか?

  1. テキスト変更
  2. データの取得
  3. DataGridView の更新 (レンダリング/ペイントなし)
  4. テキスト変更
  5. データの取得
  6. DataGridView の更新 (レンダリング/ペイントなし)
  7. ...テキスト変更
  8. データの取得
  9. DataGridView の更新 (最終的なレンダリング/ペイント)
  10. 終わり。

テキストボックスが別のスレッドにあったようですが、まったくそうではありません。理由を知っている人はいますか?

4

1 に答える 1

6

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

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

于 2012-12-26T20:47:54.140 に答える