2010-02-04 58 views
0

我有以下配置的服务属性WCF服务与ConcurrencyMode.Multiple和I​​nstanceContextMode.Single行为和多线程安全

[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(); 
    } 
    } 
} 
} 

回答

5

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

但在这种情况下:

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

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

1

是的,我认为你在这里正确的轨道上,你的实现看起来是正确的。当使用ConcurrencyMode.Multiple时,由于多个线程将触及该服务,因此您必须使您的代码线程安全。

查看此Article (Summary Contains Sample Code),了解更多细节。

+0

但在这种情况下,没有共享资源... –

+0

是的我同意,我的假设是这是虚拟代码查看各种对象名称。 – Tanner