繁体   English   中英

更新DataGrid导致GUI挂起?

[英]Updating DataGrid causes GUI to hang?

所以我将DataGrid绑定到ICollectionView 我将虚拟化设置为True。

<DataGrid
EnableColumnVirtualization="True"                    EnableRowVirtualization="True" 
IsReadOnly="True"
ItemsSource="{Binding ImportRecords, IsAsync=True}"
Name="ImportRecordsView">

我通过TPL创建一个任务以填充ObservableCollection(大概不在GUI线程上)。

    Task<ObservableCollection<myClass>> task = Task.Factory.StartNew(

        () =>
    {
        var records = new ObservableCollection<myClass>();

        for(int i = 0; i < 10000; i++)
                    {
                        records.Add(new myClass());
                    }
        return records;

    });

我使用continue,它将在GUI线程上继续,并将结果带入视图。 我什至使用DeferRefresh()方法。

        task.ContinueWith( (e) => {
            using (ImportRecordsView.Items.DeferRefresh())
            {
                CollectionViewSource cv = new CollectionViewSource() { Source = e.Result };
                ImportRecords = cv.View;

            }
        }, System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext());

即便如此,在DataGrid完全刷新之前,您还有一两秒钟无法与窗口进行交互(似乎GUI处于阻塞状态)。 我还有什么可以做的,还是只是预期的行为?

每当GUI线程阻塞并且应用程序冻结时,我建议进行重构以使用async / await。

本质上,您可以使用var result = await Task.Run (() => { return MySlowMethod();});类的东西将繁重的工作推到后台线程上var result = await Task.Run (() => { return MySlowMethod();});

resultList<T>MySlowMethod是一些慢速方法,例如慢速数据库调用,它返回可以复制到ICollectionView

await将控制权释放回GUI线程,因此没有冻结, Task.Run在后台线程上执行繁重的工作。

我已经使用这种技术数百次了,它总是可以产生一个快速,流畅,响应迅速的应用程序。

欲了解更多信息,谷歌像async await wpf Task.Run

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM