【发布时间】:2012-03-14 15:04:06
【问题描述】:
我正在使用 ASP.NET 4.0。
从过去几周开始,很少有用户抱怨应用程序开始出现故障。 GridView 突然开始显示同一用户或其他并发用户可能在当天任何时间点访问过的 DropDown 控件的内容。同样,DropDown 控件可能由任何旧结果集的 RowID 填充,而不是实际项。
我看到一篇文章:Users seeing other users data in ASP.NET,作者讨论了导致内存泄漏行为的静态对象。
它让我想起了我项目中的一个类 Static 并包含 public static 方法。此类包含填充 DropDown、为查询输入返回 DataSet 或基于查询输入返回标量对象的方法。
该类的摘录如下:
public static class reuse
{
public static void FillDropDownList(string Query, DropDownList DropDownName, string ConnectionStringParameter)
{
SqlDataReader dr;
try
{
dbConnection.OpenConnection(ConnectionStringParameter);
//Check whether the Drop Down has existing items. If YES, empty it.
if (DropDownName.Items.Count > 0)
DropDownName.Items.Clear();
SqlCommand cmd = new SqlCommand(Query,dbConnection.cn);
dr = cmd.ExecuteReader();
DropDownName.Items.Add("-- Select --");
DropDownName.Items.Add("All");
while (dr.Read())
DropDownName.Items.Add(dr[0].ToString());
dr.Close();
}
catch (Exception ex)
{
rpkCustomErrorHandler.GetScript(HttpContext.Current.Response,ex.Message.ToString());
}
dbConnection.CloseConnection();
}
}
我想知道这是否是我上面讨论的故障的原因。如果是,有没有办法在方法的任务完成后处理静态方法。我需要将类从静态更改为默认的普通类吗?
已编辑
我有另一个类也是静态的,并被上述类使用:
public static class dbConnection
{
public static SqlConnection cn = new SqlConnection();
public static void OpenConnection()
{
try
{
cn.ConnectionString = ConfigurationManager.ConnectionStrings["cnWebTwDrill"].ToString();
if (cn.State == ConnectionState.Closed)
cn.Open();
}
catch (Exception)
{
throw;
}
}
}
我是否应该从连接类中删除“静态”并每次都使用唯一的实例来调用这个类?
【问题讨论】:
-
您的下拉菜单在 GridView 内?能否提供一些相关的aspx代码?
-
No DropDown 不在 GridView 中,但是每当我需要填充 DropDown 或 GridView 时,我都会像这样调用此类:reuse.FillDropDownList("Select CustomersNames From Customer, ComboBox1);
-
我刚刚意识到 GridViews 由 SQL DataSource 填充,每个 GridView 都是唯一的。
-
让一个用户看到另一个用户的数据可能是由于缓存策略错误造成的。
-
我没有使用缓存?默认情况下是否启用缓存,在 Control 的属性中某处?
标签: c# asp.net oop memory-leaks garbage-collection