ラジオ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
万回を呼び出すのではなく、すべての10,000を1回の呼び出しで送信できます... addの代わりにaddrangeを使用します。多くの項目を含むようには設計されていませんが、まだ多くの時間がかかります。多くのコードがあります。 –
ループの前に 'listBox1.BeginUpdate()'、後で 'listBox1.EndUpdate()'が助けになりますか? – Ryan
@Ryanはい、それは 'AddRange'を使うのと同じことです。また、別のスレッドから 'Add'や' AddRange'を呼び出す必要もありません。彼らが 'AddRange'を使うか、' BeginUpdate'と 'EndUpdate'で' Add'を使うと、読み込みはすばやくできます。 –