2016-09-05 8 views
-2

ラジオbtnに応じて、WinFormのListBoxコントロールを作成する最も良い方法は何でしょうか?ListBoxに別のスレッドでIEnumrableを実装する(winforms)

私は、リストの各オブジェクトをループするためにforeachを使用するいくつかの提案を見てきましたが、それらをlistBox.items.Add()に追加()しましたが、これは本当に悪い考えです。 rabio btn 1からは10.000レコードのリストが返されます(ループするのに時間がかかりますが、ループ中にUIがフリーズしてしまう、悪い悪いアイデア)。

これを行うにはより良い方法がありますか、UIのフリーズを停止するために別のタスクを実行していますか?

private void PopulateListBox() 
{ 
    foreach (var item in Controller.ReturnBigResultSet()) 
      this.Invoke((MethodInvoker)(() => listBox1.Items.Add(item))); 
} 

UPDATE:AddRangeを使用してコードブロック:

var watch = new Stopwatch(); 
watch.Start(); 
var list = Controller.GetAllEntries().ToArray(); 
Debug.WriteLine("List returned in {0}s with a size of {1}", watch.Elapsed.TotalSeconds, list.Count<Lejlighed>()); 
watch.Restart(); 
listBox1.Items.AddRange(list); 
watch.Stop(); 
Debug.WriteLine("Added {0} items in {1}s", listBox1.Items.Count, watch.Elapsed.TotalSeconds); 

出力です:

List returned in 3.8596527s with a size of 19022 
Added 19022 items in 1.9223412s 
+1

万回を呼び出すのではなく、すべての10,000を1回の呼び出しで送信できます... addの代わりにaddrangeを使用します。多くの項目を含むようには設計されていませんが、まだ多くの時間がかかります。多くのコードがあります。 –

+0

ループの前に 'listBox1.BeginUpdate()'、後で 'listBox1.EndUpdate()'が助けになりますか? – Ryan

+0

@Ryanはい、それは 'AddRange'を使うのと同じことです。また、別のスレッドから 'Add'や' AddRange'を呼び出す必要もありません。彼らが 'AddRange'を使うか、' BeginUpdate'と 'EndUpdate'で' Add'を使うと、読み込みはすばやくできます。 –

答えて

3

あなたが別のスレッドでからListBoxを移入する必要はありません。あなたがそれを設定する正しい方法を使用する場合、10000個のアイテムにデータを入力するのに、短時間(200〜300ミリ秒)かかります。

別のスレッドに入れたい部分は、データを追加しないデータをListBoxにロードしています。コードの下に使用するのと同じです

this.listBox1.AddRange(array); 

は、それが AddRangeを使用するのに十分だ ListBoxに項目を追加します。その後、最初の呼び出し ListBoxBeginUpdate方法と Itemsコレクションに Add項目にループを使用して、最後の呼び出し EndUpdateで:

this.listBox1.BeginUpdate(); 
foreach (var item in array) 
{ 
    this.listBox1.Items.Add(item); 
} 
this.listBox1.EndUpdate(); 

AddRange方法のsource codeを見てみましょう。

+0

ああ、私はちょうどItems.AddRAngeを使用して問題が私の "リスト"は実際には一般的なIEnumrableであり、AddRangeはObjectCollectionが必要であることに気づいた。助言がありますか? – grmihel

+0

'this.listBox1.Items.AddRange(list.ToArray());を使用してください。 –

+0

これにストップウォッチを追加したのは奇妙なことですが、約19000エントリをロードするのに5.5秒かかりました。それは本当に長い間それを取るには本当ですか? – grmihel

関連する問題