假设我在控制台应用程序中有托管的wcf服务,如下所示:
public class MyService : IContract
{
public static readonly object _locker_ = new object();
public static void DoSomething()
{
lock (_locker_)
{
//block 1
DoAnotherWork();
}
}
void IContract.Foo1()
{
lock (_locker_)
{
//block 2
DoSomeWork();
}
}
void IContract.Foo2()
{
DoSomething();
}
}
这是否确保只有一个客户在第1区?或阻止2?
答案 0 :(得分:2)
您只有一个锁,因此只有一个方法可以在任何时间点获得锁。如果要同时运行DoSomeWork和DoAnotherWork,则需要单独的锁。
另请注意,在考虑线程时需要考虑InstanceContextMode of your WCF service - 默认值为PerCall。
答案 1 :(得分:1)
静态锁定对象是每个appdomain;所以“块1”和“块2”只允许一个呼叫者。最终,是的。只要你只有一个appdomain; p
请注意,锁是可重入的,因此带锁的线程可以再次调用方法而不会死锁(但不能通过WCF;只能通过常规的C#方法调用)。