2015-07-05 37 views
1

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

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

    // Dispose code 
    .... 
} 

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

编辑
重要补充 - 我不打算叫Dispose()从多个线程。我打算使用_isDisposingAsInt来发信号通知一个后台线程,后台线程监听一个串口,并可能不正常地终止,它不应该重新抛出一个异常。

+5

调用IDisposable.Dispose从多个线程将是一个反模式。不要这样做。有一个线程是对象的所有者。编排执行流程,以便所有者线程确保在所有者调用Dispose之前使用该对象完成其他线程。 –

+0

@sevatitov - 你是对的 - 我已经添加了一些关于我的用途的解释。 – bavaza

回答

0

首先,声明_isDisposingAsInt为volatile,因为您希望它在所有线程中都得到更新。其次,你需要声明一个对象并锁定它/交换它的值,以便知道你已经在Dispose中。 你做了一行,没有比这更短的。 你可以做另一种有效的方式:

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

这样你交换前检查,如果值是0,而U节省一些公交车和阻塞线程。

+0

这里你不需要'volatile','Interlocked.CompareExchange()'就足够了。 –

相关问题