Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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#_.net_Wpf_Performance - Fatal编程技术网

C# WPF数据网格性能问题

C# WPF数据网格性能问题,c#,.net,wpf,performance,C#,.net,Wpf,Performance,我正在测试WPF DataGrid,希望替换一些winforms控件,到目前为止,我对开发过程非常满意。性能似乎是我目前最关心的问题。我的开发工作站有市场上最好的cpu,运行Windows7,有6 Gig的DDR3内存。我正在更换的windows控件的响应速度要快得多,这令人担忧 我的测试是绑定到ObservableCollection的DataGrid的基本实现,每秒更新一次。它还包括详细信息区域,可扩展以显示关于每行的更多信息。详细信息区域只是一个带有ItemsControl包装文本块的st

我正在测试WPF DataGrid,希望替换一些winforms控件,到目前为止,我对开发过程非常满意。性能似乎是我目前最关心的问题。我的开发工作站有市场上最好的cpu,运行Windows7,有6 Gig的DDR3内存。我正在更换的windows控件的响应速度要快得多,这令人担忧

我的测试是绑定到ObservableCollection的DataGrid的基本实现,每秒更新一次。它还包括详细信息区域,可扩展以显示关于每行的更多信息。详细信息区域只是一个带有ItemsControl包装文本块的stackpanel(重复6次)

我的抱怨是,如果我尝试滚动此集合,它通常会出现延迟,如果我尝试在每行进入时展开,大约15%的单击不会触发按钮单击事件(DataGridTmplateColumn>CellTemplate>DataTemplate>Button) 此外,如果某些行的详细信息被展开,滚动会更加不稳定(滚动条会在上/下移动时自行调整大小)

有哪些东西需要寻找/优化/避免

更新

到目前为止,我发现以下几点很有帮助:

  • 尽可能少地依赖动态布局。由于每个组件都包含许多子组件,并且在动态布局世界中,所有这些组件都必须调用度量和布局方法,这可能是cpu密集型的。因此,使用固定宽度代替列宽自动(或不指定宽度)

  • 安装并了解应用程序的呈现方式。真是太棒了

  • 正如Andrew指出的,ListView是一个很好的替代方案,当您不需要高级DataGrid功能时,例如更新数据,或者可能需要详细视图(我仍然希望复制)

  • 也适用于在极短时间内添加多个项目(即0.01秒内添加100个项目等)

  • 经过大量测试,我发现BindingList比ObservaleCollection快得多。我发布了由BindingList和Observable集合处理的相同负载的performance profiler快照,前者占用的cpu时间不到一半。(请记住,这不仅仅是收集性能,而是与ListView配对时的性能)


我的搜索仍在继续,因为我的应用程序中似乎有东西在泄漏内存,并在几个小时后将其减慢到停止状态。

你是说WPF Toolkit中的DataGrid?如果是,在我看来它相当慢,所以我最终使用了ListView和GridView。

关于DataGrid性能问题的一般提示:我在DataGrid中遇到了一个问题,在窗口调整大小、列排序等操作后,刷新需要几秒钟,并在执行此操作时锁定了窗口UI(1000行,5列)

这归结为WPF大小计算的一个问题(bug?)。我把它放在一个带有RowDefinition Height=“Auto”的网格中,这导致渲染系统在运行时通过测量每一列和每一行的大小来尝试重新计算DataGrid的大小,大概是通过填充整个网格(据我所知)。它应该以某种方式明智地处理这个问题,但在本例中,它不是

要快速检查这是否是相关问题,请在测试期间将DataGrid的高度和宽度属性设置为固定大小,然后再次尝试运行。如果您的性能恢复,以下选项中可能会有永久性修复:

  • 将包含元素的大小更改为相对(*)或 固定值
  • 将DataGrid的MaxHeight和MaxWidth设置为较大的固定值 比正常使用时要多
  • 尝试其他具有不同大小调整策略的容器类型(网格、DockPanel等)
更多一般提示:

对于滚动,我们所做的是尝试使用延迟滚动

<> P>为了提高过滤性能,可以考虑自己过滤绑定的集合。 对于具有大量列的网格,也应用列虚拟化。这往往会对水平滚动产生一些不利影响,但您可以测试您的场景并应用改进。对我们来说,它确实非常有效。它帮助我们刷新、重新加载和渲染大型网格的场景


性能还受到所应用样式的影响。

什么每秒更新一次?
可观察采集
?它是如何更新的(添加项、全部替换项、删除项等)?\u myObservableCollection.Insert(0,newItem)是的,但在4.0中它是框架的一部分。我会试试看。。但是关于显示/隐藏行详细信息,我该怎么做呢?ListView中没有行详细信息,当然您可以尝试通过ControlTemplates实现它,但这很麻烦。因此,如果您迫切需要RowDetails,最好使用DataGrid控件的设置。