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()
}
以上安全+干净吗?当所有 100 个线程完成它们的异步工作时, _sync 会被释放并被收集吗?
如果没有,知道何时调用 _sync.Dispose() 的最佳方法是什么?
最佳答案
简短回答:不,您不需要调用 Dispose()。
长答案:
虽然建议在使用完信号量后调用 Dispose(),但垃圾收集器迟早会处理信号量的资源。
显式调用 Dispose() 将保证相关资源的早期释放,但仅当您在短时间内创建并忘记大量信号量实例时才需要这样做。
如果您调用 Dispose(),则使用简单的 Dispose() 调用完全没问题。您不需要创建终结器 ~myclass()
因为那只会重复已经完成的信号量实现。
关于.net - 是否有必要在信号量上调用 Dispose?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13452978/