Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取数据和刷新数据网格时WPF应用程序冻结_C#_Wpf - Fatal编程技术网

C# 获取数据和刷新数据网格时WPF应用程序冻结

C# 获取数据和刷新数据网格时WPF应用程序冻结,c#,wpf,C#,Wpf,我有一组函数用EF对象填充不同的数据网格,类似于: var items = db.Items.AsNoTracking().Where(n => n.CategoryId == categoryId); var grid = grdItems as DataGrid; grid.ItemsSource = items; 我的问题是窗口冻结,即在上述代码完成之前无法单击或执行任何操作。一旦完成,网格将正确填充,因此不会出现任何问题,但在短短几秒钟内,它似乎崩溃了 我想添加一个简单的加载类型

我有一组函数用EF对象填充不同的数据网格,类似于:

var items = db.Items.AsNoTracking().Where(n => n.CategoryId == categoryId);
var grid = grdItems as DataGrid;
grid.ItemsSource = items;
我的问题是窗口冻结,即在上述代码完成之前无法单击或执行任何操作。一旦完成,网格将正确填充,因此不会出现任何问题,但在短短几秒钟内,它似乎崩溃了

我想添加一个简单的加载类型窗口/对话框,这样用户界面至少可以为用户显示一些东西,而不是看起来崩溃了。我的问题是,在上面的代码之前/之后添加frm.Show、frm.Hide,或者尝试使用UserControl覆盖,它实际上从未显示它,因为我认为线程很忙


我已经很长时间没有使用WPF了,从历史上看,我使用表单,在这种情况下,我会使用DoEvents,但据我所知,这可能是有害的,而不是有用的,所以我想知道用加载覆盖更新UI的最佳方法。特别是在数据网格被填充的情况下,我希望正在处理的任何转换器/数据器都会导致线程繁忙。

数据访问应该使用远离UI的异步调用来执行

通常,这是使用
命令
实现(从UI调用)完成的,该实现反过来会触发
异步任务


任务可用于设置一个布尔标志,以显示系统正忙,该标志反过来可绑定以向用户指示这一点。

您应该异步获取项目:

progressBar.Visibility = Visibility.Visible;
var items = await db.Items.AsNoTracking().Where(n => n.CategoryId == categoryId)
    .ToListAsync();
progressBar.Visibility = Visibility.Collapsed;
…或在后台线程上同步执行:

var items = await Task.Run(() => db.Items.AsNoTracking()
    .Where(n => n.CategoryId == categoryId)
    .ToList());

有关C#中异步编程的更多信息,请参阅。

我将使数据库访问异步,除非您知道数据绑定占用了时间。关于加载窗口,您将需要另一个GUI线程(
STAThread
),它可以输出消息循环。您有或者可以给我举个例子吗?如果冻结是由于网格绑定造成的,那么该怎么办?如果冻结是网格中的项目绑定,而不是数据加载本身呢?那么您需要加载更少的项目,或者/或者确保没有在
数据网格中禁用UI虚拟化。只加载大约十个项目。如果我删除设置ItemsSource的代码,处理所有内容所需的时间不到一秒钟。我还启用了行虚拟化来检查,但这无助于UI在完成网格处理之前被卡住。这就是为什么我想要一个加载覆盖,想法?如果你需要任何进一步的帮助,你需要提供回购。或者问一个新问题,其中包括您的XAML标记,因为我相信与您实际发布的代码相关的问题已经得到了回答。@R.Wood发布问题的完整上下文总是好的,而不是您认为重要的内容。由于您可能不了解问题的范围,您很容易会认为细节不重要,尽管它们并不重要。您还应该发布UI代码,以显示
DataGrid
是如何模板化的。还要检查输出窗口中的绑定错误,并启用所有CLR异常。这类错误很容易在未被注意的情况下存在,但它们会大大降低UI的速度。