ASP.NET FindControl内存泄漏

时间:2012-09-11 11:29:31

标签: asp.net memory-leaks

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

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

TextBoxPanelImageDropDownList ......

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

和我想的一样糟糕吗?

3 个答案:

答案 0 :(得分:0)

可能导致记忆泄漏。

要查找内存泄漏的原因,您应该使用memory profiler并找出它不应该包含的引用内容。

.NET中内存泄漏的最常见原因是尚未注册的事件处理程序,但由于每个线程模型的请求,这在ASP.NET中不会成为问题。

如果你怀疑内存泄漏(你如何确定你有一个内存?),为了找到原因进行配置文件 - 不要假设。

答案 1 :(得分:0)

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

答案 2 :(得分: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);
    }
}