我的服务配置了以下属性
[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();
}
}
}
}
答案 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)。