2012-03-12 2 views
2

2つのタブを持つフォームがあります。最初のタブは退屈で、2番目のタブ(デフォルトではユーザには見えない)には多くのコンボボックスが含まれています。バックグラウンドスレッドでコンボを入力している間に、フォームの応答が遅くなります

FormLoad()イベントの使用私はバックグラウンドスレッド上の2番目のタブ(約11,000個のアイテム/文字列)でコンボボックスを作成します。これを行うsqlコマンドも非同期です。

これは理論的には、ユーザーが最終的に2番目のタブをクリックすると(10秒か10時間かにかかわらず)、すぐにきれいに入力されたコントロールが表示されるはずですが、 4秒の遅延。私はそれを得ることはありません!すべての重い持ち上げがバックグラウンドスレッド(最初の場所でそれらを使用する全理由!)を介して行われている場合、ユーザーがそれをクリックしたときに遅く応答しないアプリケーションはなぜですか?

*最初にコンボを記入する機会を与えてくれるだけでなく、backgroundWorker1_RunWorkerComplete()メソッドが起動して、それが完了したら、すべての仕事が持っていることを知らせるデバッグメッセージを送信する*

何か助けていただければ幸いです。

+0

質問:バックグラウンドスレッドをオンデマンドで起動すると(たとえば、最初のタブのボタンを使用して)、開始する前に同じ結果が得られたら、2番目のタブを表示しますか? –

+1

コンボの11,0​​00アイテムはこれまでにない素晴らしいアイテムです。より良い形容詞は使えないだろう。私はこの問題に関していくつかの好奇心を認めていますが、私があなただったら本当の問題に取り組んでいます。 –

答えて

2

11,000です!コンボボックスアイテムをバックグラウンドスレッドに移入するための作業は完了していますが、フォームはそれらのアイテムをすべて表示する必要があります。つまり、UIスレッドは、スクロール可能なUIの一部(またはすべて)をUIに(メモリ内に)レンダリングする必要があります。これは時間を取っているものです。

ComboBoxコントロールをオーバーライドし、スクロールイベントを自分で処理することをお勧めします。このようにして、リスト全体のサブセットを必要なときに順番にロードすることができます(あなたのケースで可能な場合)。これはあなたが話す4秒遅れを防ぎます。

+0

11Kはあまりにもあなたが適切である(そして他の人もそうです)。実際はばかげています。これは自動完成が必要になった今、明らかです。 – Vidar

+0

うん。オートコンプリートは、やるべき頭痛かもしれません。 [The CodeProject](http://www.codeproject.com)にチェックしてください。もっとたくさんの記事があります(あなたが望むものにもっと適しています)。[http://www.codeproject.com/Articles/16285 /自動コンプリートコンボボックス)。ではごきげんよう... – MoonKnight

関連する問題