3

読み込みが遅いアイテムを更新する 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。それは機能しますが、あまりタスクのようには感じません...

これを達成するためのタスクネイティブの方法はありますか?

4

4 に答える 4

2

この目的のためにTask.WhenAllメソッドを使用できます。またはTaskFactory.ContinueWhenAllを使用すると、コントロールを UI スレッドにマーシャリングできます。

于 2013-09-01T17:32:38.047 に答える
0

Task.WaitAll() を実行し、後で UI に通知する別のタスクを起動してみることができます。

于 2013-09-01T17:33:29.800 に答える