2017-03-31 11 views
0

に私は非同期的にしてUIを更新する必要があり、画像パスのリストを持っている:これは私のイメージがあるためことを除いて、素晴らしい作品ロードWPF画像一覧非同期は、特定の順序

foreach (string path in paths) { 
    Task.Run(x => { 
     var bitmap = getBitmap(path); 
     Dispatcher.BeginInvoke((Action)() => Images.Add(new Image() { Source = bitmap; })); 
    }); 
} 

追加された順序が必ずしもpathsのリストに存在する順序であるとは限りません(これは期待される振る舞いではありません)。

前のタスクが完了するまで1つのタスクが完了しないような方法でループを実行する方法はありますか?

キュー順序はgetBitmapですが、pathsリストと同じ順序でディスパッチが行われるようにしたいと考えています。

各ディスパッチ呼び出しの順序を制御できない場合、以前のタスクが完了するまでタスクが実行されないようにタスク自体を注文する方法はありますか?

答えて

0

あなたはUIスレッド上に既にあると仮定すると、あなただけのUIスレッドで実行されていると、ブロッキングからgetBitmapを防ぎたい、最善かつ最も簡単な方法は、あなたにDispatcher.BeginInvokeを呼び出す必要が保存されますどのasync/awaitを使用することですあまりにも。

あなたのコードは次のようになります。

また
foreach (string path in paths) {   
    var bitmap = await Task.Run(() => getBitmap(path)); 
    Images.Add(new Image { Source = bitmap }); 
} 

これはオプションではない場合、あなたはそのようなPLINQs .AsParallel().AsOrdered()使用できます。

var bitmaps = 
    paths.AsParallel() 
     .AsOrdered() 
     .Select(getBitmap) 

foreach (var bitmap in bitmaps) 
{ 
    Dispatcher.BeginInvoke((Action)() => Images.Add(new Image { Source = bitmap })); 
} 

をしかし、あなたが利点の一部を失うことを覚えておいてください順序を保持するときの並列性。

関連する問題