読み込みが遅いアイテムを更新する UI プログラムがあります。アイテムを並行してロードし、ロードが完了するとすぐに各アイテムを表示することができました。ただし、ロード中にプログレスバーを表示し、すべてのアイテムがロードされたら非表示にしたい.
private void refreshButton_Click(object sender, EventArgs e)
{
foreach (var item in Items)
{
progressBar1.Visible = true;
Task.Factory
.StartNew(() => DoNonUiwork(item))
.ContinueWith(antedecent =>
{
UpdateUI(antedecent.Result);
if ( /* if what? */ )
{
progressBar1.Visible = false;
}
}
, TaskScheduler.FromCurrentSynchronizationContext());
}
}
すべてのタスクを覚えてParallel.WaitAll()
それらを使用することはできましたが、そうすると UI スレッドをブロックすることになり、これは良くありません。
自作の同期メカニズムをセットアップできます。おそらく、 で始まり、int itemsToUpdate = Items.Count()
に/* if what? */
なるカウンターです--itemsToUpdate== 0
。それは機能しますが、あまりタスクのようには感じません...
これを達成するためのタスクネイティブの方法はありますか?