WCF 同步异步(http://msdn.microsoft.com/en-us/library/cc294424.aspx)

1)    WCF 并发管理

引入客户端调用在线程上调用wcf服务来自于IO完成线程池。多客户端并发调用,服务本身利用多线程响应这些调用。如果这些调用都指向同一个实例,必须提供对服务的状态线程安全的访问或者承受毁坏和错误的危险。客户端回调也面对同样的问题,因为客户端回调也是被分配到线程池中的线程执行的。除了实例的同步之外,所有运行的服务也需要对资源的同步,例如:静态变量或UI控件。总而言之,并行管理包括服务和客户端回调。

 

服务实例的并行访问由ServiceBehavior特性的ConcurrencyMode属性来管理,它的定义如下所示:

public enum ConcurrencyMode

{

   Single,

   Reentrant,

   Multiple

}

 

a.       ConcurrencyMode.Single

当服务被设置为Single时,wcf自动提供对服务的同步访问,他通过使用同步锁的方式不允许与相关服务的并发调用。对该服务的每一个调用首先必须获得同步锁,如果该锁可用,则该调用获得该锁,并锁定该锁。当操作返回时,wcf释放该锁并允许其他的调用进入。最重要的是,最多仅允许一个锁来调用。当锁未被释放时,如果有多个并行的调用者,这些调用者进入一个队列,并且按照顺序获得同步锁。如果调用超时,wcf将从队列中移除该调用,客户端得到一个超时的错误。它是wcf的默认设置。

b.       ConcurrencyMode.Multiple

当服务被设置为Multiplewcf将不会以任何形式阻碍服务的调用。它意味着服务实例不与任何同步锁定相关,因此,并行调用将会尽快得到处理。

c.       ConcurrencyMode.Reentrant

ReentrantSingle模式的变体,与其相似。Reentrant与服务实例的同步锁相关联。因此并发调用也是不允许的。但是可重用服务可以调用另外的服务或者一个回调,wcf自行释放相关的同步锁。之所以称为可重入是因为如果这个调用又返回到服务实例时,可以重新进入该服务实例。

d.       Callbacks and Reentrancy

回调是可重入实例最大的用途。如果一个wcf服务可以双向调用其客户端的方法,服务需要使用Reentrant模式(或者通过使用Multiple模式禁止同步)。在回调之后处理客户端回应信息需要拥有实例锁,如果一个使用Single模式的服务回调客户端就会发生死锁。

 

为了应用客户端回调,服务就必须应用Multiple或者Reentrant模式。注意服务可回调其他客户端或者服务。如果一个配置Single的服务试图双向回调,wcf会抛出一个错误。Single服务可回调的唯一情况是:回调的操作配置为单向的,因为没有回应信息试图占有锁。

 

2)    同步上下文

服务端回调使用任意的工作线程。即使服务使用Single模式一次允许一个线程拥有同步锁,线程由wcf管理,与任意的服务或资源线程无关。服务默认地不能依赖于任何的关联线程,即使服务被同一个线程管理。同样的,服务已不能依靠任何的主机端客户线程——由主机或服务开发者创建。这种情况的问题是一些资源依赖于相关线程,例如:被服务更新的UI资源必须在UI线程上执行和访问。

 

当与特定的线程或线程集关联时,服务不能简单的在wcf的工作线程上执行调用。服务必须把调用引领到资源需要的线程上执行。

 

a.       NET Framework 2.0 同步上下文

.NET Framework 2.0引入同步上下文的概念,任何对象都可以提供一个执行上下文,其他的对象必须音量到这种上下文才可调用这个对象。同步上下文可以使单独的线程或者指定的线程集,典型的是一个单独的线程。同步上下文可以确保调用执行在正确的线程上。

 

SynchronizationContext

SynchronizationContextSystem.Threading命名空间中,代表一个同步上下文。

b.       在同步上下文中运行

c.       UI同步上下文

d.       UI访问与更新

e.       安全控制

3)    服务同步上下文

 

4)     

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值