按特定顺序加载WPF图像列表异步

时间:2017-03-31 15:26:12

标签: c# asynchronous

我有一个图像路径列表,我需要以异步方式更新UI:

$text1 = 'I wanna match pattern 1 which is very different from pattern 2';
$text2 = 'I wanna match pattern 2, again nothing similar with pattern 1 here';
$regex = '/(?J)(I wanna match pattern (?P<number>1) which is very different from pattern 2|I wanna match pattern (?P<number>2), again nothing similar with pattern 1 here)/';

echo "Pattern 1\n";
preg_match( $regex, $text1, $matches );
var_dump($matches);

echo "\n\nPattern 2\n";
preg_match( $regex, $text2, $matches );
var_dump($matches);

这很好用,除了添加我的图像的顺序不一定是它们在foreach (string path in paths) { Task.Run(x => { var bitmap = getBitmap(path); Dispatcher.BeginInvoke((Action)() => Images.Add(new Image() { Source = bitmap; })); }); } 列表中的顺序(这是预期的行为,当然,虽然不是所希望的行为)。 / p>

有没有办法以这样的方式运行任务循环,即在前一个任务完成之前一个任务没有完成?

我并不关心paths队列顺序,但我希望Dispatch按照getBitmap列表调用的顺序发生。

如果我无法控制每个Dispatch调用本身的顺序,是否有一种方法可以自行命令任务,以便在前一个完成之前不运行任务?

1 个答案:

答案 0 :(得分:0)

假设您已经在UI线程上,并且您只是想阻止getBitmap在UI线程上运行并阻塞,那么最好也是最简单的方法是使用async / {{1这样就省去了调用await的麻烦。

您的代码如下所示:

Dispatcher.BeginInvoke

或者,如果这不是一个选项,你可以像这样使用PLINQ foreach (string path in paths) { var bitmap = await Task.Run(() => getBitmap(path)); Images.Add(new Image { Source = bitmap }); }

.AsParallel().AsOrdered()

但请记住,在保留订单时,您会失去并行性的一些好处。