方法只允许在单个用户中运行

时间:2013-05-13 19:55:30

标签: c# asp.net locking

class Lock
{
    private static bool _isLocked = false;
    private static object _objLock = new object();

    public bool acquireLock()
    {
        lock (_objLock)
        {
            if (!_isLocked)
            {
                _isLocked = true;
                return true;
            }
            else
            {
                return false;
            }
        }
    }

    public void releaseLock()
    {
        lock (_objLock)
        {
            _isLocked = false;
        }
    }
}

我有一些功能只能在单个用户中运行,如果一个用户运行它,其他用户想要运行,我只需返回它们“请稍后再试”。所以我想为这些方法实现锁定。 acquireLock返回true它们可以运行,返回false禁止它们运行。 我只是想问一下,我的代码好吗?

1 个答案:

答案 0 :(得分:1)

您的代码容易受到异常攻击(在acquireLock和releaseLock之间)。

可能的解决方案:

  • 在此课程上实施IDisposable
  • 编写一个以委托作为参数的方法。只有在锁定时才执行委托。

你想要的是由Monitor.TryEnter(...)提供的,如果你还想把它包起来,那就是:

class MyLock
{
    private static bool _isLocked = false;
    private static object _objLock = new object();

    public bool Execute(Action a)
    {
        bool lockTaken = false;
        try
        {     
           Monitor.TryEnter(_objLock , ref lockTaken);
           if (_lockTaken)
           {
               a();
           }
        }
        finally
        { 
           if (lockTaken)
           {
             Monitor.Exit(lockObject);
           }
        }
        return lockTaken; 
    } 

}