我有一个信息列表 这些信息中的每一个都必须在用户控件中, 创建用户控件需要很长时间 并且用户界面挂起所以我使用了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 | 卡伊斯德
...
但信息应按以下方式接收
身份证 |姓名 |
1 |哈桑 2 | 公元
2 | 公元
3 | 广告
...
考虑使用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);
这应该允许按读取的相同顺序添加项目。