首页 > 解决方案 > UI 在批量创建对象时冻结,即使使用任务

问题描述

我有一种方法OnLoadShapeFilePolygonsCommand()可以从文件中读取多边形(几何)细节并创建一些对象。然后将它们加载到绑定到数据网格的可观察集合中。

在所有这些处理过程中,我正在显示一个进度条。刚刚添加了一个IsIndeterminate属性设置为的进度条true,当所有数据加载完毕后,我将进度条的可见性设置为false.

我的问题是,在创建多边形对象时,UI 被冻结(进度条挂起)。

我在这里做错了吗?请帮忙。

private async void OnLoadShapeFilePolygonsCommand()
{
    // ...
    // some code

    await Task.Factory.StartNew(() =>
    {
        List<Ploygon> collection = new List<Ploygon>();
        foreach (Graphic g in graphics)
        {
            collection.Add(new Ploygon(g,.. .. ..);
        }
        return collection;
    },CancellationToken.None, TaskCreationOptions.AttachedToParent, TaskScheduler.FromCurrentSynchronizationContext())
    .ContinueWith((antecedent) =>
    {
        Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal, ThreadStart)delegate ()
        {
            // MapPolygons is observable collection binded to datagrid.
            MapPolygons.AddRange(antecedent.Result);
            //...
        });
        },scheduler);
    }
}

标签: wpfuser-interfaceasynchronousasync-awaitfreeze

解决方案


你为什么await使用Task.Factory.StartNewand ContinueWith

试试这个:

var collection = await Task.Run(
    () => graphics.Select(g => new Ploygon(g,.. .. ..)).ToList());

// MapPolygons is observable collection binded to datagrid.
MapPolygons.AddRange(collection);
...

推荐阅读