确保方法只被调用一次的逻辑
本文关键字:一次 方法 调用 确保 | 更新日期: 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,并且可以节省一些总线和阻塞线程。