C# 更新DataGrid会导致GUI挂起吗?

C# 更新DataGrid会导致GUI挂起吗?,c#,wpf,datagrid,.net-4.0,C#,Wpf,Datagrid,.net 4.0,因此,我将DataGrid绑定到ICollectionView。我将虚拟化设置为True <DataGrid EnableColumnVirtualization="True" EnableRowVirtualization="True" IsReadOnly="True" ItemsSource="{Binding ImportRecords, IsAsync=True}" Name="ImportRecordsView"> 即使在所有这些

因此,我将
DataGrid
绑定到
ICollectionView
。我将虚拟化设置为True

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

即使在所有这些之后,在
DataGrid
完全刷新之前,仍有一两秒钟您无法与窗口交互(看起来像GUI被阻塞)。还有什么我可以做的,或者这只是预期的行为吗?

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

本质上,您可以使用类似于
var result=wait Task.Run(()=>{return MySlowMethod();})的方法将繁重的任务推到后台线程上

result
是一个
列表
MySlowMethod
是一种缓慢的方法,比如缓慢的数据库调用,它返回一些可以复制到
ICollectionView
中的内容

wait
将控件释放回GUI线程,因此没有任何东西会冻结,
Task.Run
在后台线程上执行繁重的操作

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


有关更多信息,请使用类似于
async的谷歌工具等待wpf任务。运行

尝试ListView GridView尝试在没有任务的情况下更新数据网格。ContinueWith()因为wpf会自动将PropertyChanged调度到UI线程。也许这是拖延。
    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;

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

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