0

我们最近发现我们的 ASP.NET 应用程序有很多这样的行:

Label lbXXX = (Label)FormView.FindControl("lbXXX");

TextBox, Panel, Image, DropDownList...也一样

这可能是内存泄漏的原因吗?

有我想的那么糟糕吗?

4

3 回答 3

0

它不太可能导致内存问题。然而,它并非没有成本。

正如您在下面看到的,第一个操作是在尚未创建它们时EnsureChildControls调用。CreateChildControls这可能会导致您的性能/内存问题。

由 ASP.NET 页面框架调用以通知使用基于组合的实现的服务器控件创建它们包含的任何子控件,以准备回发或呈现。

然后不会FindControl有这个问题,而是您的自定义控件。

这是实现(来自 ILSpy):

protected virtual Control FindControl(string id, int pathOffset)
{
    this.EnsureChildControls();
    if (!this.flags[128])
    {
        Control namingContainer = this.NamingContainer;
        if (namingContainer != null)
        {
            return namingContainer.FindControl(id, pathOffset);
        }
        return null;
    }
    else
    {
        if (this.HasControls())
        {
            this.EnsureOccasionalFields();
            if (this._occasionalFields.NamedControls == null)
            {
                this.EnsureNamedControlsTable();
            }
        }
        if (this._occasionalFields == null || this._occasionalFields.NamedControls == null)
        {
            return null;
        }
        char[] anyOf = new char[]
        {
            '$',
            ':'
        };
        int num = id.IndexOfAny(anyOf, pathOffset);
        string key;
        if (num == -1)
        {
            key = id.Substring(pathOffset);
            return this._occasionalFields.NamedControls[key] as Control;
        }
        key = id.Substring(pathOffset, num - pathOffset);
        Control control = this._occasionalFields.NamedControls[key] as Control;
        if (control == null)
        {
            return null;
        }
        return control.FindControl(id, num + 1);
    }
}
于 2012-09-11T11:39:27.603 回答
0

不太可能导致内存泄漏。

要找到内存泄漏的原因,您应该使用内存 分析器并找出不应该保留引用的内容。

.NET 中内存泄漏的最常见原因是尚未取消注册的事件处理程序,尽管这在 ASP.NET 中往往不是问题,因为它的每线程请求模型。

如果您怀疑内存泄漏(您如何确定确实有内存泄漏?),请分析以找出原因 - 不要假设。

于 2012-09-11T11:32:16.690 回答
0

内存泄漏,这里不可能。是的,不建议过度使用查找控件。由于您观察到很多此类事件,因此最好解决它们并清理您的代码。性能也达到了目前应有的控制。

于 2012-09-11T11:36:47.010 回答