【问题标题】:Using locks to access a method in C#使用锁访问 C# 中的方法
【发布时间】:2016-01-19 11:24:21
【问题描述】:

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

private static Object _Lock = new Object();

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

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

但我认为这是不正确的。如何改进上述代码,使其成为正确的工作方式?

【问题讨论】:

  • 你的意思是,在不同的机器上?你的问题我不清楚。
  • B() 可能是服务调用吗?我认为您的问题可能过于笼统。
  • @PatrickHofman:用户在不同的机器上。该项目是一个网站。
  • @JamesThorpe:B() 不是服务调用,而是一种方法。
  • 好的。在这种情况下,B 需要多长时间?您是否愿意让您的用户在没有响应的情况下排队?是什么让你认为你所拥有的不正确?

标签: c# locks


【解决方案1】:

我同意@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");      
        }
    }
}

希望对你有帮助,
利隆

【讨论】:

    【解决方案2】:

    这是一个简单的程序,我使用了单吨模式。您也可以使用“监视器”来实现锁定。

    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");      
        }
    }
    

    【讨论】:

      【解决方案3】:

      通常,您应该尽可能保持锁定,因此取决于您所做的事情,将锁定语句移动到方法 B 仅保护不支持多个并行用户的资源可能是有意义的。

      但通常你的例子没有错。

      【讨论】:

        【解决方案4】:

        你可以用这个属性声明方法B:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-08
          • 1970-01-01
          相关资源
          最近更新 更多