2011-06-30 56 views

回答

2

ConcurrencyMode.Multiple有意义只有当你有实例存储,其允许共享服务实例。在REST服务的情况下,你很可能没有这样的实例(除非你使用单例服务),你不应该有这样的实例化(因为REST服务不保持状态 - 所有状态都在请求中传输)。

REST服务使用每个请求实例,并且每个请求由一个新线程(来自线程池)和服务类的新实例自动提供。你根本不需要这个设置。

WebOperationContext.Current从上下文中的专用线程静态变量中检索当前上下文,以便它不被线程共享。

+0

是的,我可以在OperationContext类中看到用ThreadStatic属性标记的currentContext专用字段。谢谢拉迪斯拉夫你的回答。 –

0

好吧,无论是是和否。WebOperationContext.Current属性确实是线程安全的。但是返回的WebOperationContext对象的实例成员不是。这意味着您必须自己管理服务方法中的同步。

这里的MSDN说怎么样ConcurrencyMode.Multiple

服务实例是 多线程。没有同步 保证。因为其他 线程可以随时更改您的服务对象 ,所以您必须始终处理 同步和状态一致性 。然后

服务实现可以是这个样子:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class MyService : IMyService 
{ 
    private Object syncObject = new Object(); 

    public void MyServiceOperation() 
    { 
     lock (this.syncObject) 
     { 
      // Service implementation 
     } 
    } 
} 
+0

那么,有什么关于'WebOperationContext.Current'?它应该以某种方式了解当前的情况。由于它是静态的,它应该动态检索我猜测的当前线程的上下文。 –

+0

@bsnote正确:静态[WebOperationContext.Current](http://msdn.microsoft.com/zh-cn/library/system.servicemodel.web.weboperationcontext.current.aspx)属性是线程安全的。但是[WebOperationContext](http://msdn.microsoft.com/en-us/library/system.servicemodel.web.weboperationcontext.aspx)类的实例成员不是,所以所有尝试操作对象上的任何属性来自多个线程可能会受到竞争条件的影响。您最好将整个服务方法实现同步到安全的一面。 –