【问题标题】:Performance deteriorating after async postback - scrolling becomes horrendous异步回发后性能恶化 - 滚动变得可怕
【发布时间】:2015-09-30 06:47:19
【问题描述】:

我的任务是帮助提高不幸使用更新面板的 asp.net (4.5) 网络表单应用程序的性能。 They are really evil. 但是摆脱它们并不是那么简单,因为系统被捆绑到一大堆东西上。我已经能够摆脱一些不必要的更新面板。

无论如何,这是一个 CRM 类型的系统,因此想象一下您进入了一个客户的详细信息页面。在客户的此详细信息页面中,您有一些一般客户信息。页面底部有选项卡。例如,客户详细信息页面可以包含适用于该客户的“联系人”标签、客户销售的“产品”、客户的“评级”等等。这些选项卡中的每一个基本上都是一个 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 个不同的选项卡,获取数据的性能仍然很棒..但是在我获取数据并滚动页面之后,它是可怕的。滚动条有时甚至会跳动,因为它跟不上我想要浏览页面的速度。

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

  • 消除了尽可能多的不需要的更新面板
  • 将更新模式从always 更改为conditional
  • childrenastriggers 更改为false
  • 在 asp.net / js 方面尽可能多地修复了任何错误/优化

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

编辑更新

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

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

这允许我在服务器端处理视图状态。效果是 html 标记已经摆脱了所有视图状态信息,但是,我仍然没有解决的问题是,当我继续通过触发页面上的事件进行异步回发时,我的页面变慢了。我所说的减慢是指当我向上/向下滚动页面时,性能真的很差。当我滚动时,滚动条必须基本上赶上我。因此,即使摆脱了客户端页面上生成的视图状态信息,我仍然遇到滚动条非常慢的问题。由于页面上的事件(例如过滤器/单击事件或网格上的排序或页面索引更改(基本上是导致异步回发的任何事情))再次发生这种情况。

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

【问题讨论】:

  • 听起来像“绘画”,这让我想到了“记忆”,这让我想到了“缓存”。也许玩缓存(服务器,而不是本地),将其关闭(或打开)。 (我想这是服务器的事情,所以可能不相关,但至少值得检查/知道发生了什么。)你试过其他机器吗?
  • 是的,发生在任何人和每个人身上。这可能是从更新面板中吐出的视图状态信息,但由于应用程序的性质,我无法禁用视图状态。而且我已经在压缩视图状态
  • 讨厌的东西,更新面板。让我的皮肤爬行。我想说在世界末日之前重新写一遍。但是,这个问题看起来像是视图状态膨胀和回调多米诺骨牌。你试过Page.EnableViewState = false;吗?你处理过Init, Load, PreRenderUnload中的ScriptManager.IsInAsyncPostBack吗?
  • @dave 如果我将页面视图状态设置为 false,我会失去视图状态,这确实是需要的。当您提到您是否处理过 IsInAsyncPostBack 我应该在这些方法中做某事时,您的第二点是什么意思?
  • 无论您的Init, Load, PreRenderUnload 事件做什么,都不应在IsInAsyncPostBack 上完成

标签: jquery asp.net updatepanel


【解决方案1】:

获取数据的性能非常好——这不是我的问题。

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

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

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

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

【讨论】:

  • 这不是很多数据,可能有 2 到 300 行。它是一种自定义分页解决方案,因此您一次只能获得 25 条记录。摆脱更新面板可以解决问题。
  • 更新面板一次只能回发一个吗?我仍然不清楚页面是否由于多个未决的网络调用而滞后,或者是否由于 javascript 试图更新 DOM 而滞后。您是在浏览器中加载了所有 2-300 行,还是一次只请求和显示 25 行?
【解决方案2】:

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

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

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

【讨论】:

  • 很遗憾我这里没有使用树形视图
【解决方案3】:

好吧,终于我得到了这个工作......这个问题与我在这里找到的另一个最近的问题有关:Why is telling jQuery to click my link button slowing my page down?

它的要点是我正在订阅更新面板之外的控件上的事件。实际上,根据我的 jquery 中的重新订阅,将 n 个事件加倍、三倍或附加 n 个事件。请参阅我发布的链接。

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 2010-12-20
    • 1970-01-01
    • 2016-07-28
    • 2013-01-23
    • 2017-12-04
    • 2018-03-18
    • 2012-02-01
    相关资源
    最近更新 更多