是否有必要在信号量上调用Dispose?

Har*_*can 7 .net multithreading dispose semaphore

class myclass 
{
    private Semaphore _sync;

    myclass ()
    {
          _sync = new Semaphore(1,1);
    }

    doasync()
    {
           _sync.WaitOne();
           //do some stuff
           _sync.Release();
    }
}


 somefunctionsomewhere() 
 {
     var myobject = new myclass();    
     //spawn 100 threads that all call myobject.doasync()
 }
Run Code Online (Sandbox Code Playgroud)

以上安全+清洁?当所有100个线程完成异步工作时,两个_sync是否会被释放并收集myclass?

如果没有,知道何时调用_sync.Dispose()的最佳方法是什么?

Arm*_*min 7

简答:不,你不需要调用Dispose().

答案很长:

虽然建议在使用信号量时调用Dispose(),但垃圾收集器迟早会处理信号量的资源.

对Dispose()的显式调用将保证关联资源的早期发布,但只有在短时间内创建并忘记大量Semaphore实例时才需要它.

如果你调用Dispose(),使用简单的Dispose()调用是完全没问题的.您不需要创建终结器,~myclass()因为这只会复制已经完成的Semaphore实现.

  • 它不仅仅是GC可能得到它,它也是Dispose清理类使用的任何非托管资源,所以假设GC将处理它不一定是安全的. (2认同)