1、并发:
概念:WCF中的并发指的就是同一个服务实力上下文(Instance Context)同时处理多个服务调用请求。
1)、在WCF服务端框架中,激活的服务实力不是单独存在的,而是被封住在一个被称为实例上下面的对象中,WCF提供了三种不同的实例上下文:Per-Call,Per-Session和Single。
2)、WCF中是如何控制并发的呢,由于并发处理本身是服务的行为,因此我们通过服务行为(Service Behavior)对采取的不同的并发策略进行控制,而不同的并发策略,对应不同的并发模式。
3)、并发的处理:
在服务上添加服务行为特性:ServiceBehaviorAttribute特性,设置ConcurrencyMode属性,这个属性对应着三个枚举值,如下:
- Single:一个实力上下文同时只处理一个请求。
- Reentrant:一个实力上下文同时只处理一个请求。但是,当服务端需要回调客户端的时候,这个时候,该服务实例可以处理另外的请求,等回到完成的时候,如果该实例没有处理其他请求,就可以继续处理该请求,如果处理了就等待别的请求完成了在处理该请求。
- Multiple:一个实例上下文可以同时处理多个服务请求。
对于Single和Reentrant来说,都是只能同时处理一个请求,WCF默认的情况下,是Single。
4)、回调(CallBack)中的并发:
对于回调契约,也有对应的回调并发的处理方式:我们通常在回调的服务上添加CallbackBehavior特性,设置ConcurrencyMode属性来处理回调服务的并发。
5)、事务行为与并发:
这里只讲一点,在ServiceBehavior特性里,如果设置ReleaseServiceInstanceOnTransactionComplete为True,指的是WCF在事务结束以后释放实例上下文,所以这个模式只能在Single下使用,如果把ReleaseServiceInstanceOnTransactionComplete属性为True,而ConcurrencyMode不为Single则会报异常。
6)、并发的同步:同步执行即串行执行,这里就讲Single和Reentrant下的同步实现。
- Single下的同步实现:在InstanceContext内,有一个System.Object 的属性ThisLock,锁的方式实现单一访问。
- Reentrant下的同步实现:同样也是通过锁的方式实现的。
8)、不同的实例上下文,如何处理并发的呢?
- 单调(PerCall)实例上下文模式:
PerCall模式,不管客户端是否是同一个,服务端针对每个请求都会建立一个新的实例上下文来处理,所以不存在并发的问题。
[ServiceBehavior(UseSynchronizationContext = false,InstanceContextMode=InstanceContextModel.PerCall)]
public class CalculatorService:ICalculator {}
- 会话(PerSession)实例上下文模式:
PerSession模式下,满足下面三个条件:服务契约采用Allowed或者Required的会话模式,服务采用PerSession的实例上下文模式,终结点的绑定提供对会话的支持,上面三个条件,如果不全部满足,WCF采用的就是单调的实例上下文模式,如果同时满足上面三个条件,那么,在Single和Multiple的并发模式下,分别采用串行和并行的模式。
- 单例(Single)实例上下文模式:
并发模式是Single的,就是串行的,并发模式是Multiple的就是并行的。

2、同步上下文与线程亲和性
在ServiceBehavior中,设置UseSynchronizationContext属性,这个属性代表同步上下文,设置为false的时候,可以解除同步上下文与线程的关联性,达到同步执行的效果,如果设置为true,那么,就是串行执行,和线程有密切关联,达不到同步执行的效果。
浙公网安备 33010602011771号