我们最近发现我们的 ASP.NET 应用程序有很多这样的行:
Label lbXXX = (Label)FormView.FindControl("lbXXX");
TextBox
, Panel
, Image
, DropDownList
...也一样
这可能是内存泄漏的原因吗?
有我想的那么糟糕吗?
我们最近发现我们的 ASP.NET 应用程序有很多这样的行:
Label lbXXX = (Label)FormView.FindControl("lbXXX");
TextBox
, Panel
, Image
, DropDownList
...也一样
这可能是内存泄漏的原因吗?
有我想的那么糟糕吗?
它不太可能导致内存问题。然而,它并非没有成本。
正如您在下面看到的,第一个操作是在尚未创建它们时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);
}
}
内存泄漏,这里不可能。是的,不建议过度使用查找控件。由于您观察到很多此类事件,因此最好解决它们并清理您的代码。性能也达到了目前应有的控制。