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

本文关键字:一次 方法 调用 确保 | 更新日期: 2023-09-27 18:01:17

我正在编写一个IDisposable类,它打算在多线程环境中使用。我想确保Dispose()只被调用一次。到目前为止,我想到了:

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

是否有更优雅的方式来实现这一点?

编辑
重要的补充-我不打算从多个线程调用Dispose()。我打算使用_isDisposingAsInt来通知后台线程,该线程侦听串行端口,并且可能不优雅地终止,它不应该重新抛出异常。

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

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

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

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

这种方式可以在交换前检查值是否为0,并且可以节省一些总线和阻塞线程。