4

以前叫:aspx中如何处理加载下动态创建的控件

回答以下问题:确定要恢复哪些控件所需的信息包含在专用视图状态对象中。

我在代码隐藏页面中动态创建控件 - 这些控件都连接到单击处理程序,因此当发生回发时,我必须重新创建前一组控件,然后清除控件并根据上一次点击。

这在正常情况下编码并正常工作,基本上如下:

in Page_Load
if not postback generate default buttons 
else if postback re-generate buttons that were shown on last page

in click_handler
Clear the dynamically generated buttons created in the Page_Load
generate new buttons based on the specific click being handled

但是,当服务器承受负载时,我们开始遇到问题:

每秒有 5 个用户时,我们开始遇到异常: 找到具有相同 ID 'add0' 的多个控件。FindControl 要求控件具有唯一的 ID。

每秒有 100 个用户时,我们开始遇到异常: 在 DataBind、Init、Load、PreRender 或 Unload 阶段无法修改控件集合。

一旦发生这种情况,所有后续请求都会收到相同的错误,并且必须重新启动 IIS。

可能是什么原因造成的,我该如何避免?html 请求在负载下是否可能会相互覆盖和干扰?页面卸载后对象是否以某种方式传递,从而允许下一页加载绊倒它们?

4

3 回答 3

2

您如何存储有关您需要恢复的控件的信息?如果您使用 ViewState 或 ControlState,那么我看不出负载会如何影响事物。这就是任何复合控​​件的工作方式。

我会说我在使用 Infragistics UltraWebGrid 时看到了您的第二个错误,但一直无法追踪到它。从调用堆栈看来,EnsureChildControls 似乎是在加载阶段(或者可能是 LoadViewState)被调用的。

于 2009-04-02T15:07:43.387 回答
2

一个私有静态变量用于存储名称和表格单元格的字典,以便在页面生命周期中不会重新创建表格单元格。

关键是它被标记为静态 - 它应该是一个实例变量 - 最终结果是当请求开始备份时在负载下,然后多个请求共享这个静态字典。

究竟发生了什么我不是 100% 确定 - 但在中等负载下 FindControl 会找到多个同名控件,在非常高的负载下似乎一个请求会尝试修改一个控件(可能添加到它),而它在来自其他请求的无效状态。

最终结果——如果你真的不知道你在做什么——更喜欢实例变量而不是静态变量。

于 2009-04-03T14:03:16.210 回答
0

你所写的一切似乎都是正确和可行的。这很可能是您的控件生成代码的问题。也许如果您发布其中的一些内容,我们可以更好地找到解决方案。

于 2009-04-03T00:14:42.803 回答