【问题标题】:UI thread stalls on loading and updating a RadGridView objectUI 线程在加载和更新 RadGridView 对象时停止
【发布时间】:2011-07-29 15:55:24
【问题描述】:

下午好,

我目前正在分析一个相当大的 C# WPF 应用程序,试图消除一些性能问题。一个涉及在切换到特定(相当大的)用户控件时发生 5-8 秒的停顿。我已将其缩小为包含在此 UserControl 中的 RadGridView,它需要很长时间来加载和更新自身,从而使 UI 线程停滞并使整个应用程序无响应。显然,如果可能的话,我们希望消除这个停顿。

我已经尝试剥离网格上的任何自定义样式和 DataTriggers,但是虽然这通常可以减少 UI 线程上的负载,但停滞仍然存在,似乎没有减少。通过 ANTS Profiler,似乎主要归咎于网格的测量和布局,以及一些 XAML 模板的加载。在没有网格行的情况下,UserControls 加载速度明显更快,而且似乎只添加少量行就足以导致这种停滞。网格为行和列启用了虚拟化,但这似乎没有帮助。检查时调用图非常深,似乎是引发更新通知、更新布局、加载 XAML 以及最重要的是测量应归咎于子 FrameworkElements 的调用。

对于几个潜在的解决方案,我正在考虑将 UserControl 保留在内存中但隐藏起来以减少切换到它的成本,或者填充网格,也许是在 UserControl 加载之后很久。前者可能需要做很多工作,因为控件订阅了许多东西,需要根据需要连接、断开连接和重新连接。后者也可能涉及大量工作,但可能是一个更好的解决方案,因为这样至少我们可以尝试自己减轻停顿,或者至少在发生时警告用户。

如果问题仍然存在,我们可能会要求 Telerik 看看它,但我想我会先在这里问一下,以防之前有人遇到过这样的问题(甚至不一定是 RadGridView)并发现一些描述的解决方案。

干杯。

【问题讨论】:

  • 这是 Telerik WPF 控件和特别是 RadGridView 的普遍问题。它们的滚动速度非常快(.NET 4 WPF 内置的 Datagrid 在这方面很糟糕)、内置过滤等......但是它们的负载海岸非常糟糕,无法减少。看看他们的 WPF 演示:在相当现代的 PC 上加载每个需要 3-4 秒。我已经放弃了。

标签: asp.net wpf performance telerik-grid


【解决方案1】:

问题是您需要一个正确实现 ICollectionChanged 的​​集合。

在将所有记录添加到源集合后尝试此操作(每次添加后不应引发任何 CollectionChanged 事件),它可以工作:

public void AddRange(List<TValue> values, int startingIndex)
{
    // add all the items to your internal list, but avoid raising events.

    // now raise CollectionChanged with an IList type.
    CollectionChanged?.Invoke(collection, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, addedValues, startingIndex));
}

请注意,我们传递的是 IList&lt;TValue&gt;,而不是 TValue。当它看到一个列表时,它会在处理之前将它们全部添加。在开始添加项目之前,startingValue 通常是列表的 .Count。

步骤:

  1. 子类化尚未实现 INotifyCollectionChanged 的​​集合类型。那里有大量开源示例。
  2. 添加上述方法并在添加项目后使用它。
  3. 我的 RadGridView 正在绑定一个 QueryableCollectionView,它使用这个列表作为它的 SourceCollection。不知道能不能直接绑定这个列表。

RadGridView 的一个奇怪行为是,如果您以这种方式添加一百万条记录,它会很快,但所有 new 行都将是空白的,您可以看到 RadGridView 慢慢填充它们从最上面的新项目开始的数据。我对此的解决方案是绑定 QueryableCollection 并将其 PageSize 设置得足够小,以便用户看不到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多