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

标签 c# .net multithreading

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

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/

相关文章:

c# - ASP.NET Core 2.0 webApp 在发布到 iis 后显示 'view Index was not found...'

.net - 相同的属性,不同的类型

javascript - 通过 Azure API 管理流式传输

Python multiprocessing.managers.BaseManager 按顺序运行注册的可调用函数

c++ - 如何在 C++ 中使用 boost 获取定时器功能?

c# - 如何禁用向上/向下键滚动 Visual Studio 中的方法重载?

c# - 如何创建一个使用模式如锁的方法?

c# - 在 MSTest 中,如何指定某些测试方法不能相互并行运行?

.net - Application.ThreadException : memory leak if not detached?

java - 在 ParallelStream 中配置线程