我有一个被多线程使用的方法。在该方法中,有一些关键代码我必须使用锁来只允许一个线程访问它。因此,代码如下所示:
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);
}
}
关于c# - 有条件地在线程中使用锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49517620/