Behavior_控制实例的并发
服务行为 ServiceBehavior 实例行为 + 事务行为 + 并发行为 + 限制行为
端点行为 EndPointBehavior 消息检查 + 调度行为
操作行为 OperationBehavior 参数筛选
服务行为
控制服务实例化 + 并发 + 事务
场景(实例行为和并发行为)
如图 有call1 call2 call3 三个请求
此时服务实例如何控制,是初始化一个HomeService实例还是多个呢?
并发行为控制,一个HomeService实例可以让多个线程访问吗?
1. WCF默认 : PerCall + Single(multi) (实例控制PerCall 并发控制Single/multi 都可以),每次请求创建新的服务实例,每个实例单线程处理(此时服务端仍然是多线程处理,但是会初始化三个服务实例,并发处理三个请求)
2. Single + Single
3. Single + Multi (注意控制并发风险)性能更高
实例控制为Single时,服务启动时创建服务实例,实例控制为PerCall时,每个请求到达时创建实例
服务端
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[ServiceBehavior( InstanceContextMode = InstanceContextMode.PerCall , ConcurrencyMode = ConcurrencyMode.Multiple)] public class Service3 : IService3 { public Service3() { Console.WriteLine("CTOR Service3"); } public void DoS(int i) { Console.WriteLine(i); System.Threading.Thread.Sleep(2000); } }
客户端
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
static void Main(string[] args) { Parallel.For(1, 100, x => { Console.WriteLine(x); ServiceReference1.Service3Client client = new ServiceReference1.Service3Client(); client.DoS(x); }); Console.ReadKey(); }
MaxConcurrentInstance : 设置同一时刻服务上下文实例的最大数。PerCall和PerSeesion起作用;Single时只有一个实例,对他不起作用
MaxConcurrentSession : 设置同一时刻可以接受的最大会话数。
MaxConcurrentCalls :设置服务最大消息并发数。(控制并发线程最大数)对Single和Multi都起作用
InstanceContextMode.Single 单实例 ConcurrencyMode.Multiple 多线程 MaxConcurrentCalls=1 等同 单实例 单线程