在 C# 中使用锁访问方法

Using locks to access a method in C#

我有一个调用另一个方法 B 的方法 A。单击按钮时,将调用方法 A,然后调用方法 B。但是,当 2 个用户同时单击按钮时,我只希望一个用户访问方法 B,而另一个等待方法 B 完成。我想到了这样做:

private static Object _Lock = new Object();

private void A(){
  lock(_Lock){
     B();
  }
}

用户在不同的机器上。该项目是一个网站。

但我认为这是不正确的。我怎样才能改进上面的代码,使其成为正确的工作方式?

这是一个简单的程序,我使用了单吨模式。您也可以使用 "Monitor" 实现锁定。

public class Program
{
    public static void Main()
    {
        LockSample lockObject = LockSample.GetInstance();
        lock(lockObject)
        {
          lockObject.MethodA();
        }
    }
}

public class LockSample
{
    private static LockSample _Lock;
    public static LockSample GetInstance()
    {
       if(_Lock == null)
       {
          _Lock = new LockSample();
       }
       return _Lock;
    }

    public void MethodA()
    {
       Console.WriteLine("MethodA Called");
       MethodB();
    }

    private void MethodB()
    {
      Console.WriteLine("MethodB Called");      
    }
}

一般来说,你应该让你的锁尽可能少,所以根据你所做的,将锁语句移动到方法 B 中只保护不支持多个并行用户的资源可能是有意义的。

但一般来说,你的例子没有任何问题。

我同意@Torestergaard 的观点,你应该让锁尽可能细。因此,如果采用@Rebornx 上面提供的代码示例并稍微修改一下,您可以使用如下示例:

public class Program
{
    public static void Main()
    {
        LockSample lockSampleInstance = LockSample.GetInstance();
        lockSampleInstance.MethodA();
    }
}

public class LockSample
{
    private static readonly LockSample INSTANCE = new LockSample();
    private static Object lockObject = new Object();

    public static LockSample GetInstance()
    {
        return INSTANCE;
    }

    public void MethodA()
    {
       Console.WriteLine("MethodA Called");
       MethodB();
    }

    private void MethodB()
    {
        lock(lockObject)
        {
            Console.WriteLine("MethodB Called");      
        }
    }
}

希望对您有所帮助,
里昂

您可以使用此属性声明方法 B:

[MethodImpl(MethodImplOptions.Synchronized)]
public void B() {
   ...
}