C# 使用联锁交换的状态变量的临界段

C# 使用联锁交换的状态变量的临界段,c#,locking,critical-section,interlocked,C#,Locking,Critical Section,Interlocked,我试图使用成员变量(int\u state)上的Interlocked.Exchange来保护一个关键部分。代码如下: if (Interlocked.Exchange(ref _state, 1) == 0) { // *** Danger zone *** try { // Do something } finally { _state = 0; } } \u state也在别处读取以确定状态,因此

我试图使用成员变量(
int\u state
)上的
Interlocked.Exchange
来保护一个关键部分。代码如下:

if (Interlocked.Exchange(ref _state, 1) == 0)
{
    // *** Danger zone ***
    try
    {
         // Do something
    }
    finally
    {
         _state = 0;
    }
}
\u state
也在别处读取以确定状态,因此这是必需的

我担心的是,如果“危险区”发生异常,
\u state
将永远不会被设置为0,并且将永远无法再次输入关键部分


在仍然能够设置状态变量的情况下,有没有更好的方法来实现这一点?我应该使用双锁模式吗?

为什么不将危险区放在try块内?请参阅锁上的文档:@Evk那里没有C代码。我的观点是,编译器放置在那里的中间代码可能会导致异常@AdamBenson当然我知道
lock
,但是考虑到
\u state
用于控制对关键部分的访问,并且在其他地方读取,这对我提到的
\u state
变量有何帮助?这就是为什么我使用
Interlocked.Exchange
,至少以原子方式读/写它。我不确定您是否应该关心这些事情。以basic
锁为例。它的用法类似于
if(Monitor.TryEnter(myLock,ref locktake)try{…}finally{…}
,没有人认为如果在同一个“危险区域”抛出异常,锁就不会被释放。@Evk很好。感谢您的比较。如果C#不在乎,那么我就不在乎。)