【发布时间】: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, PreRender和Unload中的ScriptManager.IsInAsyncPostBack吗? -
@dave 如果我将页面视图状态设置为 false,我会失去视图状态,这确实是需要的。当您提到您是否处理过 IsInAsyncPostBack 我应该在这些方法中做某事时,您的第二点是什么意思?
-
无论您的
Init, Load, PreRender和Unload事件做什么,都不应在IsInAsyncPostBack上完成
标签: jquery asp.net updatepanel