Skip to main content
 首页 » 编程设计

c#之有条件地在线程中使用锁

2024年02月25日37kevingrace

我有一个被多线程使用的方法。在该方法中,有一些关键代码我必须使用锁来只允许一个线程访问它。因此,代码如下所示:

private void RunCode() 
{ 
    ......  // some other codes 
    lock (myLock) 
    { 
        ......  // critical code01 
    } 
 
    ......  // some other codes 
 
    lock (myLock) 
    { 
        ......  // critical code02 
    } 
 
    ....... // some other codes 
} 

这段代码正在被多线程使用。现在,因为一些工作流程的变化,我们希望保持代码原样运行,但在某些特殊情况下,我们希望在不锁定的情况下立即运行关键代码。即使计算结果不是 100% 正确,我们也可以,因为我们没有锁定它。因此,代码应如下所示:

private void RunCode(bool isSpecial) 
{ 
    ......  // some other codes 
    lock (myLock)   // if isSpecial == true, do not lock it, otherwise, lock it 
    { 
        ......  // critical code01 
    } 
 
    ......  // some other codes 
 
    lock (myLock)   // if isSpecial == true, do not lock it, otherwise, lock it 
    { 
        ......  // critical code02 
    } 
 
    ....... // some other codes 
} 

根据研究,看来我们必须做类似的事情

if (isSpecial) 
{ 
    ......  // critical code01 
 
} 
else 
{ 
    lock (myLock) 
    { 
        ......  // critical code01 
    } 
} 

它会起作用,但问题是我们必须重复关键的 code01(和 code02)两次。这些代码非常复杂,并且与 RunCode() 方法中的其他代码密切相关。

我的问题是:是否有更好的方法来做到这一点?有什么建议么?我们正在使用 c# .net,但欢迎提出任何建议。

谢谢

请您参考如下方法:

尝试直接使用 Monitor 类。它有一个方法 TryEnter
像这样重写你的代码:

try 
{ 
    if (isSpecialCase || Monitor.TryEnter(myLock, TimeSpan.MaxValue)) 
    { 
        // critical code01 
    } 
} 
finally 
{ 
    if (!isSpecialCase) 
    { 
        // lock was taken 
        Monitor.Exit(myLock); 
    } 
}