异步回发后性能下降 – 滚动变得骇人听闻

我的任务是帮助提高asp.net(4.5)webforms应用程序的性能,不幸的是使用了updatepanels。 他们真的很邪恶。 但摆脱它们并不是那么简单,因为系统与一大堆东西捆绑在一起。 我已经能够摆脱一些不必要的更新面板。

无论如何,这是一个CRM类型系统,所以想象一下你去一个客户的详细信息页面。 在客户的详细信息页面中,您可以获得一些常规客户信息。 在页面底部有标签。 例如,客户详细信息页面可以包含适用于该客户的“联系人”选项卡,客户销售的“产品”,以及客户的“评级”等。 这些选项卡中的每一个基本上都是div,并且它周围是一个更新面板。 最初只加载第一个选项卡。 当您单击选项卡时,将进行异步调用,该调用将使用数据加载选项卡。 所以基本上你有一个看起来像这样的页面:伪代码:

updatepanel for entire page html  updatepanel for contacts sub panel contacts html /updatepanel updatepanel for products sub panel products html /update panel updatepanel for ratings sub panel ratings html /update panel /updatepanel end the entire page 

提到的选项卡是div,基本上是jquery选项卡。 起初我注意到页面上的每个更新面板都将其updatemode设置为always 。 当我需要更新面板更新时,我立即将updatemode更改为conditional并显式调用Update() 。 一个非常小的改进。 然后我注意到初始更新面板(用于整个页面的面板)将其ChildrenAsTrigger属性设置为true …所以我将其更改为false。 很小的改进。

然后我再次开始测试页面,看看性能如何…仍然非常糟糕。 实际上,当页面首次加载并且第一个选项卡加载页面时非常快。 当我单击另一个选项卡时(它通过异步进程加载子面板数据,通过调用隐藏按钮服务器端事件来加载数据)。 所以这绝对不是真正的ajax,但嘿,它是我们拥有的。 所以基本上服务器端事件只是将一些数据绑定到该选项卡上的网格。 获取数据的性能绝对正常 – 这不是我的问题。

我现在的问题是,当我向上和向下滚动页面时,性能开始下降。 一旦我点击另一个选项卡或另外2-3个不同的选项卡获取数据的性能仍然很棒..但是在我获得数据后我滚动页面它的可怕性。 滚动条有时会​​跳转,因为它无法跟上我想要浏览页面的速度。

我不知道除了完全转储updatepanel之外还有什么办法可以加速这个页面,但是有太多的工作和时间来做这件事。 到目前为止,我尝试了以下内容:

  • 消除了许多不需要的更新面板
  • 将更新模式从always更改为conditional
  • childrenastriggers改为false
  • 在asp.net / js端修复了任何bug /优化

我还能做些什么来解决这个问题或者还有什么可能导致延迟缓慢? 如上所述,获取数据的速度非常快,当我上下移动(滚动)页面时,这是非常不稳定的。 我按照msdn的建议更新面板如何更新。

编辑更新

我仍然在努力寻找更好的方法。 我试过用这个:

http://aspadvice.com/blogs/robertb/archive/2005/11/16/13835.aspx

这允许我处理服务器端的视图状态。 效果是html标记已经摆脱了所有的视图状态信息,然而,我仍然有的问题还没有解决的事实是,当我继续通过页面上的触发事件做异步回发时,我的页面变慢了。 我的意思是减速是因为我向上/向下滚动页面表现非常糟糕。 当我滚动时,滚动条基本上可以跟上我。 因此,即使在客户端页面上摆脱生成的视图状态信息,我仍然遇到滚动条非常慢的问题。 这又发生在页面上的事件,例如filter/点击事件或网格上的排序或页面索引更改(基本上任何导致异步回发的事件)。

如果有人有其他想法,请随时加入。

最后我得到了这个工作……这个问题与我在这里找到的另一个最近的问题有关: 为什么告诉jQuery单击我的链接按钮会减慢我的页面速度?

它的要点是我订阅了更新面板之外的控件事件。 实际上,基于在我的jquery中重新订阅,加倍,三倍或附加n个事件。 看我发布的链接。

获取数据的性能绝对正常 – 这不是我的问题。

我现在的问题是,当我向上和向下滚动页面时,性能开始下降。

你确定这是由于异步回发吗? 您一次尝试在页面上显示多少数据?

如果浏览器正在执行多个回发,那么更新面板可能是罪魁祸首。 但听起来好像页面加载和更新很好,浏览器正在努力渲染文档。 如果没有关于页面的更多具体细节,我们无法确定。

我的建议是它可能不是更新面板问题,而是分页问题。 您是否有任何选项可以分解您的数据并且一次只显示几个块?

我在使用更新面板中包含大量数据的treeview时遇到了巨大的性能问题。 如果您有树视图,它可以“使”页面在所需的回发后自行获得完整的回发。 追踪将告诉故事。 最后我写了一个ajax包装器并自己做了部分回发。 Treeview可以是一个朋克。

如果您没有树视图请忽略。

编辑:如果重要的话,我在树视图中有大约250个项目,最多4个深。