在《WCF 并发的本质》中,我们谈到了WCF提供的三种不同的并发模式,使开发者可以根据具体的情况 选择不同的并发处理的策略。对于这三种并发模式,Multiple采用的并行的执行方式,而Single和 Reentrant则是采用串行的执行方式。串行执行即同步执行,在WCF并发框架体系中,这样的同步机制是如 何实现的呢?
一、Concurrency.Single模式下的同步实现
实际上,WCF并发框架体系下针对Concurrency.Single模式的实现非常简单,其本质就是对 InstanceContext进行加锁。如果采用反编译工具查看InstanceContext的定义,你会发现 InstanceContext类中定义了一个类型为System.Object名为ThisLock的内部属性,而该属性实际上就是对 基类CommunicationObject同名属性的引用,相关代码入下所示。WCF就是通过对InstanceContext的 ThisLock进行加锁,确保了对InstanceContext的同步访问。
1: public sealed class InstanceContext : CommunicationObject, IExtensibleObject<InstanceContext>
2: {
3: //其它成员
4: internal object ThisLock
5: {
6: get
7: {
8: return base.ThisLock;
9: }
10: }
11: }
12: public abstract class CommunicationObject : ICommunicationObject
13: {
14: //其它成员
15: protected object ThisLock { get; }
16: }
具体来讲,WCF服务端运行时在处理服务调用消息请求之后,利用实例上下文提供者 (InstanceContextProvider)创建新的或者获取现有的InstanceContext。然后,WCF会将请求消息分发 给该InstanceContext对消息进行进一步处理。在处理操作执行之前,如果发现相应的服务采用的并发模 式是ConcurrencyMode.Single,WCF运行时会试图获取InstanceContext的ThisLock上的锁,或者说后续的 操作进行再对InstanceContext的ThisLock锁定的情况下执行的。这样就保证了单一的InstanceContext对 象在ConcurrencyMode.Single并发模式下永远是以同步的方式被调用的。