WCF服务和锁定关键字

时间:2012-01-25 07:56:15

标签: c# .net wcf using

假设我在控制台应用程序中有托管的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?

2 个答案:

答案 0 :(得分:2)

您只有一个锁,因此只有一个方法可以在任何时间点获得锁。如果要同时运行DoSomeWork和DoAnotherWork,则需要单独的锁。

另请注意,在考虑线程时需要考虑InstanceContextMode of your WCF service - 默认值为PerCall。

答案 1 :(得分:1)

静态锁定对象是每个appdomain;所以“块1”和“块2”只允许一个呼叫者。最终,是的。只要你只有一个appdomain; p

请注意,锁是可重入的,因此带锁的线程可以再次调用方法而不会死锁(但不能通过WCF;只能通过常规的C#方法调用)。