0

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

4

1 回答 1

0

考虑使用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);

这应该允许按照它们被读取的相同顺序添加项目。

于 2018-06-03T14:44:39.167 回答