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时,每个请求到达时创建实例

服务端

[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);
        }
    }
View Code

客户端

 static void Main(string[] args)
        {
           Parallel.For(1, 100, x =>
            {
                Console.WriteLine(x);
                ServiceReference1.Service3Client client = new ServiceReference1.Service3Client();
                client.DoS(x);
            });

            Console.ReadKey();
        }
View Code

 

MaxConcurrentInstance : 设置同一时刻服务上下文实例的最大数。PerCall和PerSeesion起作用;Single时只有一个实例,对他不起作用

MaxConcurrentSession : 设置同一时刻可以接受的最大会话数。

MaxConcurrentCalls :设置服务最大消息并发数。(控制并发线程最大数)对Single和Multi都起作用

InstanceContextMode.Single 单实例 ConcurrencyMode.Multiple 多线程 MaxConcurrentCalls=1  等同 单实例 单线程

posted @ 2020-02-06 13:19  vvf  阅读(125)  评论(0编辑  收藏  举报