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

标签 .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()
 }

以上安全+干净吗?当所有 100 个线程完成它们的异步工作时, _sync 会被释放并被收集吗?

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

最佳答案

简短回答:不,您不需要调用 Dispose()。

长答案:

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

显式调用 Dispose() 将保证相关资源的早期释放,但仅当您在短时间内创建并忘记大量信号量实例时才需要这样做。

如果您调用 Dispose(),则使用简单的 Dispose() 调用完全没问题。您不需要创建终结器 ~myclass()因为那只会重复已经完成的信号量实现。

关于.net - 是否有必要在信号量上调用 Dispose?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13452978/

相关文章:

c# - TreeView 多次触发 BeforeSelect 事件

python - python能够在多核上运行吗?

multithreading - 通过 golang 进行 gitlab 抓取的问题

c# - 什么时候处理对象? C#

c# - 如何处理对象列表;是否释放内存

.net - WCF 自定义序列化程序

.net - 如何强制应用程序使用 .NET 3.5 或更高版本?

c# - 如何简化在主窗体和子窗体之间传递的设置值的代码

python - 如何将 joblib 并行化与不返回任何内容的类内方法一起使用

c# - 完成队列释放速度不够快