我正在编写一个IDisposable
类,该类旨在用于多线程环境。我想确保Dispose()
只被调用一次。到目前为止,我提出了:
int _isDisposingAsInt = 0;
public void Dispose()
{
if (Interlocked.Exchange(ref _isDisposingAsInt , 1) == 0)
return;
// Dispose code
....
}
是否有更优雅的方法来实现这一目标?
修改
重要的补充 - 我不打算从多个线程调用Dispose()
。我打算使用_isDisposingAsInt
来发出后台线程的信号,该后台线程会监听串口,并且可以非正常地终止,它不应该重新抛出异常。
答案 0 :(得分:0)
首先,将_isDisposingAsInt声明为volatile,因为您希望它在所有线程中都得到更新。
其次,你需要声明一个对象并锁定它/交换它的值,以便知道你曾经在Dispose。 你在一行中做到了,没有比这短。 你可以用另一种有效的方式来做到这一点:
if(Interlocked.CompareExchange(ref _isDisposingAsInt , 1 , 0) == 0)
这样你在交换之前检查值是否为0,并且你保存了一些总线和阻塞线程。