代码改变世界

WCF 第五章 并发和实例(服务行为)

2010-12-01 21:45  DanielWise  阅读(1716)  评论(1编辑  收藏  举报

并发是一个多少个任务可以同时执行的度量,以任务(请求,工作,事务,以及类似的)的形式度量。执行时间是一个任务多长时间完成的度量,以时间(毫秒,秒,其他的时间单位等)度量。吞吐量是在一个指定时间里可以完成多少个任务的度量,以任务/时间(请求/秒, 事务/分,等等)的形式度量。吞吐量是关于并发和执行时间的函数。

  有两种方式来增加吞吐量:减少执行时间或者增加并发量。减少一个独立任务的执行时间可以通过改变任务调度间隔算法或者添加额外的硬件资源,所以WCF对这些都无能为力。并发可以通过并行执行任务来实现。WCF有两种控制并发的行为: InstanceContextMode 和 ConcurrencyMode.

  InstanceContextMode服务行为用来控制实例而且可以设置成以下三种值:

     Single. 服务类的一个实例处理所有接收到的请求。这实现了一个单例。

     PerCall. 为每个接收到的请求创建一个服务类的实例。

     PerSession. 每个客户端会话创建一个服务类实例。当使用不支持会话的信道时,所有的服务调用与PerCall一样,即便是InstanceContextMode被设置成PerSession.

  默认设置下,当一个不支持会话的绑定被使用时,InstanceContextMode.PerSession 降级为PerCall,指导WCF为每个用户(实际上是代理)创建一个新的服务类实例。

  ConcurrencyMode服务行为用来控制一个服务实例内部的线程并发。默认设置,ConcurrencyMode.Single,指导WCF在某一时刻旨在服务类的实例中执行一个线程。这个行为可以被设置成三个值之一:

    Single. 在一个时刻只有一个线程可以访问服务类。这是最安全的设置因为服务操作不必担心线程安全。

    Reentrant. 在一个时刻仅有一个线程可以访问服务类,但是这个线程可以离开类并在稍后返回继续。

    Multiple. 多个线程可以同步访问服务类。这个设置要求类创建在线程安全基础上。

  使用这两个设置,InstanceContextMode和ConcurrencyMode,它们一起可以帮助你定制一个服务的实例和并发以便于你可以定位特殊的性能需求。

  表5.1 联合InstanceContextMode和ConcurrencyMode