继续更改我的列表顺序

时间:2018-06-03 14:16:01

标签: c# task continuewith

我有一个信息列表这些信息中的每一个都必须在用户控件中,创建用户控件需要很长时间并且用户界面挂起所以我使用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);

输出是:

ID |名称|

10 |阿里
9 |哈迪
1 |哈桑
15 | kajsd
...
但是应该收到如下信息

ID |名称|

1 |哈桑
2 |广告
2 |广告
3 |广告
...

1 个答案:

答案 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);

这应该允许按照读取的顺序添加项目。