确保方法只被调用一次的逻辑

时间:2015-07-05 18:14:35

标签: c# idisposable

我正在编写一个IDisposable类,该类旨在用于多线程环境。我想确保Dispose()只被调用一次。到目前为止,我提出了:

int _isDisposingAsInt = 0;
public void Dispose()
{
    if (Interlocked.Exchange(ref _isDisposingAsInt , 1) == 0)
        return;        

    // Dispose code
    ....
}

是否有更优雅的方法来实现这一目标?

修改
重要的补充 - 我不打算从多个线程调用Dispose()。我打算使用_isDisposingAsInt来发出后台线程的信号,该后台线程会监听串口,并且可以非正常地终止,它不应该重新抛出异常。

1 个答案:

答案 0 :(得分:0)

首先,将_isDisposingAsInt声明为volatile,因为您希望它在所有线程中都得到更新。

其次,你需要声明一个对象并锁定它/交换它的值,以便知道你曾经在Dispose。 你在一行中做到了,没有比这短。 你可以用另一种有效的方式来做到这一点:

if(Interlocked.CompareExchange(ref _isDisposingAsInt , 1 , 0) == 0)

这样你在交换之前检查值是否为0,并且你保存了一些总线和阻塞线程。