public class MyResource : IDisposable
{
private bool disposed = false;
public void aaaa()
{
//---问题地方1------
//数据库访问
//调用其他类(还在不断的运行中)
}
public void Dispose()
{
Dispose(true);
}
public void Close()
{
Dispose(true);
}
~MyResource()
{
Dispose(false);
}
private void Dispose(bool disposing)
{
//-------问题地方2 -----------
if (!this.disposed)
{
if (disposing)
{
GC.SuppressFinalize(this);
}
Console.WriteLine("释放类本身所使用的非托管资源");
disposed = true;
}
}
}
关于释放资源的问题要请教前辈们!
上面写的问题地方1和问题地方2,是我要请教的地方。
如果aaaa()还在运行中,还没等结束我就调用了Dispose(),这时aaaa()的托管资源和非托管资源还没释放,
那我是不是要在问题地方2处写关闭数据库等等的信息,还是系统会自动完成呢?谢谢!
Any instance members are not guaranteed to be thread safe.
谁要多线程调用你的实例方法,谁就要为多线程的各种风险负责
Dispose是private,就只能你自己内部调用了,既然还没完成操作,你调用干什么?如果非调不可,而且aaa()内部处理是循环,那么有个循环变量来控制,在调用Dispose的时候就改变变量。。如果aaa内部只是一个非常耗时的长操作,那么就可能在手动释放的时候出现问题,比如资源被其他地方引用了,无法释放。。
异常捕获一下
void aaaa()
{
try
{
}
catch
{
}
finally
{
try
{
释放非托管资源
...
}
catch
{
}
finally // 如果还不放心,如正被占用,无法释放
{
尝试拖到系统退出时回收
this.disposed=false;
GC.ReRegisterForFinalize(this);
}
}
}
~MyResource()
{
Dispose(false);
}