在 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() {
...
}
我有一个调用另一个方法 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() {
...
}