WCF服务具有ConcurrencyMode.Multiple和I​​nstanceContextMode.Single行为和多线程安全性

时间:2010-02-04 11:15:45

标签: c# .net wcf multithreading

我的服务配置了以下属性

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public class UserService : IUserServiceContract
{}

我是否应该在此方案中使用服务中实现的方法的锁定机制?

如果是,这是正确的实施吗?

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public class UserService : IUserServiceContract
{
private readonly object LockObject = new object();

public Object1 GetObject1()
{
    lock (LockObject)
    {
        using (var ob = new Object1)
        {
            return ob.Get();
        }
    }
 }

 public Object2 GetObject2()
 {
  lock (LockObject)
  {
    using (var ob = new Object2)
    {
        return ob.Get();
    }
  }
 }
}

2 个答案:

答案 0 :(得分:5)

您应该同步对所有共享资源(即所有服务字段或属性)的访问权限。

但在这种情况下:

public Object2 GetObject2()
 {
  lock (LockObject)
  {
    using (var ob = new Object2)
    {
        return ob.Get();
    }
  }
 }

不,没有必要锁定,因为没有共享资源。对于每个调用(或消息),都有单独的调用堆栈,因此在这种情况下,单独的调用将创建单独的Object2实例。

答案 1 :(得分:1)

是的,我认为你在这里正确,你的实施看起来是正确的。使用ConcurrencyMode.Multiple时,您必须使代码线程安全,因为多个线程将访问该服务。

有关详细信息,请参阅此Article (Summary Contains Sample Code)