WCF实例与并发的一些测试
来源:互联网 发布:黄鹤tv 武汉网络电视 编辑:程序博客网 时间:2024/06/08 18:59
概要
实例管理可以理解为服端怎么管理(创建与销毁)Service 类的实例
而并发可以理解为WCF框架在收到客户端请求后针对目标Service实例的派发行为,Single表现为如果Service已经在处理请求了,那么新的请求(注意是针对同一个Service实例的)将排队,如果是Mutiple那么请求将立即执行,其实质是请求的处理基于同一个Service实例的锁定同步行为。
进一步说明,WCF针对请求的处理是基于池线程的,当使用NetTcp的同个proxy(对应物理上的一Tcp链接)发出多个请求时,如果服务器使用的是PerCall+Single组合,那么该条TCP链接的请求将串行华处理(无法说是分配一个固定线程处理,因观察到同个proxy,50个并发请在两个线程上运行--指更换过一次线程)。
//==========测试代码服务端=============
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using System.Threading;namespace WCFServer{ class Program { static void Main(string[] args) { var timer = new Timer((o) => { GC.Collect(); }, null, 0, 100); using(ServiceHost host=new ServiceHost(typeof(CalculatorService))) { host.AddServiceEndpoint(typeof(ICalculator), new NetTcpBinding(), "net.tcp://192.168.1.31:8888/CalculatorService"); host.Opened += (s,e) => { Console.WriteLine("服务启动!"); }; host.Open(); Console.Read(); } } } [ServiceContract] public interface ICalculator { [OperationContract] int Add(int x, int y); } [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,ConcurrencyMode=ConcurrencyMode.Single)] public class CalculatorService : ICalculator,IDisposable { public CalculatorService() { Console.WriteLine( AddThreadMsg( "Instantiated!")); } public int Add(int x, int y) { Console.WriteLine(AddThreadMsg( string.Format("index:{0}, Time:{1}, Operation method is invoked.",x,DateTime.Now))); Thread.Sleep(1000); return x + y; } ~CalculatorService() { Console.WriteLine(AddThreadMsg( "Finalized!")); } public void Dispose() { Console.WriteLine(AddThreadMsg( "Dispose!")); } private string AddThreadMsg(string msg) { return msg + ",ThreadId:" + Thread.CurrentThread.ManagedThreadId; } }}
//==========测试代码客户端=============
static void Main(string[] args) { using (ChannelFactory<ICalculator> channelFac = new ChannelFactory<ICalculator>(new NetTcpBinding(), "net.tcp://192.168.1.31:8888/CalculatorService")) { var proxy = channelFac.CreateChannel(); if (null != proxy as ICommunicationObject) { (proxy as ICommunicationObject).Open(); } Random rnd=new Random(); for (int i = 1; i < 50; i++) { var index = i; Thread t=new Thread(()=>{ try { Thread.Sleep(rnd.Next(100, 10000)); Console.WriteLine(string.Format("{3}:{0}+{1}={2}", index, 2, proxy.Add(index, 2), index)); //(proxy as ICommunicationObject).Close(); } catch (Exception ex) { Console.WriteLine(string.Format("Error-{0}:{1}", index, ex.Message)); } }); t.Start(); } Console.Read(); } Console.WriteLine("完成"); Console.Read(); } }
//说明
1.在使用NetTcpBinding时,一个客户端proxy跟一条连接对应(可以通过创建多个proxy模拟多个客户端),在调用open后,可以通过netstat命令看到建立的TCP 连接。
2.当使用多线程模拟多个并发的链接时(proxy),服务器默认只能并行的接收11个连接,这个跟socket编程时监听端口允许并发的链接数设置一致。
3.PerCall + Mutiple时,建立一个proxy在未打开的情况下在多个线程中调用,proxy会根据调用先后对这些调用请求进行串行华处理。
4.PerCall + Mutiple时,建立多个proxy进行并发调用,服务器表现是并行处理请求。
5.PerCall + Single时,建立多个proxy并发请求时,服务器呈现并行处理,而单个proxy并发请求时,服务器呈现串行处理,当把NetTcpBingding换成BasicHttpBinding时服务器又变为出并行处理,不过可以通过netstat看到,使用http协议后单个proxy的并发调用实际上是建立了多个tcp连接的,
可见PerCall +Single时针对同个链接发来的请求是串行处理的
6.针对同一个客户端代理的并发调用,其请求会在客户端被串行后发出。不支持回话的信道绑定不受会话节流阀限制
参考: http://www.cnblogs.com/tyb1222/archive/2012/05/23/2515535.html
- WCF实例与并发的一些测试
- WCF实例与并发
- WCF实例上下文与并发
- WCF服务实例模式与并发、限流
- wcf的并发与限流
- 回调与并发: 通过实例剖析WCF基于ConcurrencyMode.Reentrant模式下的并发控制机制
- WCF 第五章 控制并发实例的数量
- WCF的并发
- apache ab测试并发多次实例与单次实例
- WCF ServiceHost的实例方式及ServiceHost实例的并发方式
- 简单的WCF实例
- WCF的一些配置
- WCF处理并发的问题
- 【WCF】最简单的WCF实例
- 并发与实例模式
- 并发与实例模式
- 高并发测试下的一些问题及解决
- 高并发测试下的一些问题及解决
- jvm java虚拟机 新生代的配置
- 【缓存\性能】HTML5缓存的那些事
- Mysql常用命令
- 欢迎使用CSDN-markdown编辑器
- 抽象类和接口的区别
- WCF实例与并发的一些测试
- 第一章绪论上机实验题1-1输出素数
- java中多态的详解
- css position(2)
- CQUOJ B. 粥可赛艇
- nyoj 73 比大小
- 360笔试编程题之第二题
- Android APK反编译就这么简单 详解(附图)
- 2016微软开发者大会 - 简洁收集