我有一个图像路径列表,我需要以异步方式更新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调用本身的顺序,是否有一种方法可以自行命令任务,以便在前一个完成之前不运行任务?
答案 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()
但请记住,在保留订单时,您会失去并行性的一些好处。