我有一个遗留应用程序,我会不时收到OutOfMemory
异常。我正在尝试调试和解决问题。我正在考虑的选项之一是使用Dispose()
方法。我知道任何实现IDisposable
接口的对象都可以让我在其上调用Dispose()
方法,但它也有助于释放资源以将类级别变量设置为null
吗?像ArrayList
或Hashtable
吗?
我确实在互联网上搜索并找到了一些帖子,但对于是否要null
个对象却有些困惑。
我正在尝试的代码
public class RepET : IDisposable
{
#region Public Member Variables
public ArrayList country_list;
public Hashtable data;
public ArrayList survey_dates;
public ArrayList city_list;
public Dictionary<string, Dictionary<string, string>> cityData;
public Dictionary<string, Dictionary<string, string>> reportCity_list;
SqlConnection connection = new SqlConnection();
SqlCommand cmd = new SqlCommand();
#endregion
// Flag: Has Dispose already been called?
bool disposed = false;
// Protected implementation of Dispose pattern.
protected void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing)
{
connection.Dispose();
cmd.Dispose();
country_list = null;
data = null;
survey_dates = null;
city_list = null;
cityData = null;
reportCity_list = null;
}
disposed = true;
}
public void Dispose()
{
Dispose(true);
}
}
这对内存异常有帮助吗?
null
的唯一时间设置字段将对垃圾回收有所作为,如果您仍以某种方式仍使RepET
实例可访问,在这种情况下,真正的解决方案是:确保[C0 ]实例不再可访问!将字段设置为RepET
可以解决实际问题。
使用null
来层叠Dispose()
和connection
之类的东西是适当的,但是...我的另一部分认为不存储它们更好的方法,即获得连接按需,并保持cmd
完全在其使用位置;类似于:
cmd
但是,真正的窍门是找到持有实例的东西,if才是真正的问题。没有上下文很难评论,但是:事件和静态缓存是开始寻找的好地方。