A-A+

WCF异步处理

2015年07月28日 C#基础知识 WCF异步处理已关闭评论 阅读 291 次

1、IsOneWay

IsOneWay是异步吗?

所有方法都能通过IsOneWay实现异步吗?

http、net.tcp都支持这种模式吗?

简单来说,单向操作没有返回值,客户端只管调用,不管结果。单向操作客户端一旦发出请求,WCF会生成一个请求,不会给客户端返回任何消息。单向操作不同 于异步操作,虽然单向操作只是在发出调用的瞬间阻塞客户端,但如果发出多个单向调用,WCF会将请求调用放入队列,并在某个时候执行。队列存储调用的个数 是有限的,一旦发出的调用个数超出了队列存储调用的设置值,则会发生阻塞现象,因为调用无法放入队列。当队列的请求出列后,产生阻塞的调用就会放入队列,并解除对客户端的阻塞

将契约接口声明为单向,也就是OneWay,这样客户端对此服务接口调用从效果来看就是异步的。因为它无需等待服务端返回,客户端只需将消息发送到传输层就立即返回。

那能不能将将这种客户端对服务端的异步调用直接标记为单向的,那是不是可以不用生成异步代理类(即上述SvcUtil /Ayncs或者在添加引用时声明将代理类生成异步操作)?答案是否定的,因为OneWay要求方法的返回值为void,而异步的方法需要IAsyncResult为返回值,这两者矛盾的。

“当一个WCF服务方法IsOneWay配置为False时,当你用同步方法调用它时,他就是“跨进程同步”的,你的当前线程最终会被设置为等待,直到对方执行完毕或者抛出异常,将执行完的信息返回调用端后,你的当前线程才能被恢复,从而继续执行,对应的异步方法是与他的同步方法对应的,这不用多说。当一个WCF服务方法IsOneWay配置为True时(注意:只能设置在没有返回值的方法上),当你用同步方法调用它时,它就是“发送队列端同步”的,你的当前线程同样最终会被设置为等待,但只要能在一定的时间内和对方正确连接上,并将方法参数无误的发过去,你的当前线程便会恢复执行,而不需等待对方任何执行结果(什么结果?执行完毕或者异常信息),同样,“发送队列端异步”也是与之对应的,这也不用多说。”

参考资料:

http://www.cnblogs.com/quietwalk/archive/2011/08/09/2132573.html

http://msdn.microsoft.com/zh-cn/library/system.servicemodel.operationcontractattribute.isoneway(v=vs.110).aspx

 

2、如何实现WCF异步

1)IsOneWay

2)客户端线程(线程、线程池、委托等)

3)wcf客户端契约增加异步方法

其中IsOneWay在上面已经详细介绍了,线程实现方法也不在这讲解了,下面主要说下wcf客户端如何实现异步调用。

不管是通过ChannelFactory创建服务代理对象,还是通过SvcUtil的默认方式生成服务代理对象,客户端在调用这些代理对象时,都无法直接实现异步方式的调用。

在调用代理对象的方法时,我们无法找到对应于TransferDocument()操作的BeginTransferDocument()和EndTransferDocument()异步方法。

这样的设计使得我们无法通过编程方式异步地调用服务的操作,除非我们在定义服务接口时,直接加入相关操作的异步方法。然而,这又直接导致了服务的设计与方法调用方式之间的耦合。一个好的框架设计要素在于,不管客户端的调用方式(同步或者异步),服务的设计与实现应该是一致的。对于服务的设计者而言,在设计之初,就不应该去考虑服务的调用者调用的方式。换言之,服务操作究竟是否采用异步方式,应该由客户端的调用者决定。因此,所有与异步调用相关的内容应该只与客户端相关。WCF遵循了这一规则。

标签:

评论已关闭!

Copyright © 极品飞鸽 保留所有权利.   Theme  Ality 蜀ICP备14015766号-1

用户登录

分享到: