异步回发后性能下降 - 滚动变得可怕

Performance deteriorating after async postback - scrolling becomes horrendous

我的任务是帮助提高 asp.net (4.5) webforms 应用程序的性能,不幸的是它使用了 updatepanels。 They are really evil. 但摆脱它们并不是那么简单,因为系统与一大堆事物相关联。我已经能够摆脱一些不必要的更新面板。

在任何情况下,这是一个 CRM 类型的系统,所以假设您转到某个客户的详细信息页面。在客户的这个详细信息页面中,您有一些一般客户信息。页面底部有选项卡。例如,客户详细信息页面可以包含为该客户工作的 "Contacts"、客户销售的 "Products"、客户的 "Ratings" 等标签。这些选项卡中的每一个基本上都是一个 div 并且环绕它的是一个更新面板。最初只加载第一个选项卡。当您单击该选项卡时,会进行异步调用,该调用会加载带有数据的选项卡。所以基本上你有一个看起来像这样的页面:伪代码:

updatepanel for entire page
  html  

  <!-- tabs -->

  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 个不同的选项卡,获取数据的性能仍然很棒..但是在我获取数据并滚动页面后,它变得非常糟糕。滚动条有时甚至会跳动,因为它跟不上我想要浏览页面的速度。

除了完全转储更新面板之外,我不知道还能做什么来加快此页面的速度,但是这样做的工作量和时间太多了。到目前为止,我已经尝试了以下方法:

我还能做些什么来解决这个问题,或者还有什么可能导致延迟缓慢?如前所述,获取数据的速度非常快,当我上下移动(滚动)页面时,页面非常不稳定。 I followed msdn's recommendation for how update panels refresh.

编辑更新

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

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

这让我可以在服务器端处理视图状态。结果是 html 标记已经摆脱了所有视图状态信息,但是,我仍然有尚未解决的问题是,当我继续通过页面上的触发事件进行异步回发时,我的页面慢下来。我所说的变慢是指当我向上/向下滚动页面时,性能非常糟糕。当我滚动时,滚动条基本上必须跟上我。因此,即使在客户端页面上删除生成的视图状态信息,我仍然 运行 陷入滚动条非常慢的问题。这再次发生是由于页面上的事件,例如过滤器/点击事件或网格上的排序或页面索引更改(基本上是导致异步回发的任何事情)。

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

Performance of getting the data is absolutely fine - that is not my issue.

My issue is now as I scroll up and down the page performance is starting to degrade.

您确定这是由于异步回发造成的吗?您一次要在页面上显示多少数据?

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

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

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

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

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

好吧,我终于成功了...这个问题与我最近在这里发现的另一个问题有关:

要点是我在更新面板之外的控件上订阅了事件。实际上,根据我 jquery 中的重新订阅,将事件增加一倍、增加三倍或附加 n 个事件。请参阅我的 link 帖子。