WCF中采用控制台宿主和Winform宿主的主要区别
来源:互联网 发布:怎么看windows 版本 编辑:程序博客网 时间:2024/05/18 02:12
一般的文章中都写到了WCF可以采用多种宿主方式,但是对于控制台宿主和Winform宿主有哪些区别,多数没有写清楚。
对于服务端来说,WCF消息监听和接收体系通过IO线程池并发的处理来自客户端的服务调用请求,所以并发抵达的服务调用请求消息能够得到及时的处理。但是,服务操作具体在那个线程线程执行,则是通过WCF的并发处理体系决定的。
在默认的情况下,WCF采用这样的机制控制并发操作的执行:如果在进行服务寄宿(IIS寄宿方式除外)的过程中,当前线程存在同步上下文,会将其保存在服务端分发运行时。等到需要执行服务操作的时候,WCF并发体系会判断分发运行时的同步上下文是否存在,如果不存在则在各个的线程中执行服务操作,否则,服务操作会被封送到该同步上下文中执行。
如果我们将某个服务寄宿于一个控制台(Console)应用之中,由于控制台程序的当前同步上下文为空,按照上面的并发操作执行机制,所有的请求操作会在各自的线程中并行地执行。所以,在流量允许的范围内,并发的请求能够得到及时地处理。
如果我们通过Windows Forms应用作为某个服务的宿主,服务操作的执行永远是以同步的方式执行的。也就是说,在某个时刻,仅仅只有针对某个服务调用的服务操作被执行,其他的调用请求都将被放入一个等待队列中。如果等待的时候超出了设定的超时时限(这在高并发的情况下会比较频繁),客户端会抛出TimeoutException异常。我们将服务操作与服务寄宿程序线程自动绑定的现象称为服务的线程亲和性(Thread Affinity)
在这种情况下,由于服务操作执行在UI线程中,可以正常得对Windows窗体上的控件进行操作。如果,你希望服务操作能够并发地被执行,就不得不打破这种线程亲和性,我们可以按照监控程序中的方式在服务类型上应用ServiceBehaviorAttribute特性将UseSynchronizationContext属性设置成False。但是在这种情况下,如果你需要对控件进行操作,你就需要调用Control类型的Invoke或者BeginInvoke方法,或者按照我们监控程序的方式借助于SynchronizationContext对象了。UseSynchronizationContext在ServiceBehaviorAttribute的定义如下面的代码所示,该属性的默认值为True。
1: [AttributeUsage(AttributeTargets.Class)]
2: public sealed class ServiceBehaviorAttribute : Attribute, IServiceBehavior
3: {
4: //其他成员
5: public bool UseSynchronizationContext { get; set; }
6: }
- WCF中采用控制台宿主和Winform宿主的主要区别
- WCF 基于 WinForm 宿主 发布
- 强大的WCF宿主
- 采用nettcp绑定的wcf宿主到iis7
- 在VS2013下新建一个控制台宿主的WCF工程
- 使用Winform程序作为WCF服务的宿主
- 使用Winform程序作为WCF服务的宿主
- WCF宿主
- WCF——1.2 WCF服务、控制台宿主、控制台客户端
- WCF的宿主(服务器)
- WCF——1.3 WCF服务、WinForm宿主、WinForm客户端
- WCF的宿主 - -WCF的配置文件
- WCF入门教程三[WCF的宿主]
- WCF入门教程三[WCF的宿主]
- 【菜鸟学WCF】以Winform为宿主的wcf简单教程
- 解决在Silverlight中调用WCF控制台程序宿主时跨域问题
- WCF服务以控制台程序为宿主时的跨域访问问题(附源码)
- WCF服务以控制台程序为宿主时的跨域访问问题(附源码)
- c++堆栈中 top() pop()的具体作用是什么
- JavaFX中TextFieldTableCell的颜色问题
- 【高并发简单解决方案】redis缓存队列+mysql 批量入库+php离线整合
- 0412python中文处理小记
- Fiddler不能抓取Chrome解决方法
- WCF中采用控制台宿主和Winform宿主的主要区别
- 写在最前头
- pinot 安装
- Android 基于Retrofit+Rxjava搭建的简单易用的网络架构
- 关于应用QT5连接MySQL数据库
- 【bzoj3119】【book】【贪心】
- ★ZZULIoj--1870(枚举好题)
- 事务总结
- 第六周 项目4-静态成员应用