我有一个信息列表这些信息中的每一个都必须在用户控件中,创建用户控件需要很长时间并且用户界面挂起所以我使用Task.Delay.ContinuWith ()
(为了更新用户)添加任何项目后的界面)
但是有一个问题,信息没有按顺序显示
Dispatcher.Invoke(new Action(() =>
{
waterfallFlow.Children.Clear();
var parsedValues = doc.DocumentNode.SelectNodes(...).Skip(1)
.Select(r =>
{...}).ToList();
foreach (var item in parsedValues)
{
Task.Delay(200).ContinueWith(ctx =>
{
waterfallFlow.Children.Add(_currentUser);
waterfallFlow.Refresh();
}, TaskScheduler.FromCurrentSynchronizationContext());
}
}
}), DispatcherPriority.ContextIdle, null);
输出是:
10 |阿里
9 |哈迪
1 |哈桑
15 | kajsd
...
但是应该收到如下信息
1 |哈桑
2 |广告
2 |广告
3 |广告
...
答案 0 :(得分:1)
考虑使用Dispatcher.Invoke<TResult>
超载并只是等待Task
Dispatcher.Invoke<Task>(async () => {
waterfallFlow.Children.Clear();
var parsedValues = doc.DocumentNode.SelectNodes(...)
.Skip(1)
.Select(r => {...})
.ToList();
foreach (var item in parsedValues) {
await Task.Delay(200);
waterfallFlow.Children.Add(item);
waterfallFlow.Refresh();
}
}, DispatcherPriority.ContextIdle, null);
这应该允许按照读取的顺序添加项目。