我们最近发现我们的ASP.NET应用程序有很多这样的行:
Label lbXXX = (Label)FormView.FindControl("lbXXX");
TextBox
,Panel
,Image
,DropDownList
......
这可能是内存泄漏的原因吗?
和我想的一样糟糕吗?
答案 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);
}
}