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处写关闭数据库等等的信息,还是系统会自动完成呢?谢谢! 

解决方案 »

  1.   

    只要在类上的注释里面加一句:
    Any instance members are not guaranteed to be thread safe.
    谁要多线程调用你的实例方法,谁就要为多线程的各种风险负责
      

  2.   

    最好是手动释放。。
    Dispose是private,就只能你自己内部调用了,既然还没完成操作,你调用干什么?如果非调不可,而且aaa()内部处理是循环,那么有个循环变量来控制,在调用Dispose的时候就改变变量。。如果aaa内部只是一个非常耗时的长操作,那么就可能在手动释放的时候出现问题,比如资源被其他地方引用了,无法释放。。
      

  3.   

    aaaa的私有变量?
    异常捕获一下
    void aaaa()
    {
      try
      {
      }
      catch
      {   
      }
      finally
      {
        try  
        {
            释放非托管资源
             ...
        }
        catch
        {  
        }
        finally        // 如果还不放心,如正被占用,无法释放
        {
             尝试拖到系统退出时回收
              this.disposed=false;
             GC.ReRegisterForFinalize(this);
        }
      }
    }
    ~MyResource()
    {
        Dispose(false);
    }