What's dream?

WCF分布式3-InstanceContext和ConcurrencyMode

WCF中,如果将实现契约(接口)的服务配置默认为

InstanceContextMode = InstanceContextMode.Single

也就是说这个服务对象,客户端调用这个对象的接口时,不管调用服务对象内的接口几次,

服务对象仅仅创建一次。如果多个客户端都调用这个服务对象,因为它已经创建出来了,

所以Single模式下,它也不再一一创建了。仅有一个!

InstanceContextMode = InstanceContextMode.Single下,如果再将ConcurrencyMode设置为

Single,那么是单线程运行模式,当前运行的线程会阻塞排队的待处理消息的线程;如果将

ConcurrencyMode设置为Multiply,处于多线程模式下,虽然不再阻塞,但是需要注意发生的

并发,需要对并发进行相关处理,添加互斥锁等。

 

但是,

如果将InstanceContextMode 特性(标签)定义为 PreCall时,服务对象将创建几次呢? 答案,客户端代码调用接口几次,服务对象就会要创建几次。

如下面的服务代码:

//PerCall:客户端每次调用这个服务的一个接口时,就会立即创建一个服务对象Service1,调用接口几次,就会创建Service1几次。
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class Service1 : IService1
    {
        private List<int> source = new List<int>();
        public string GetData(int value)
        {
            //lock (source)
            {
                for (int i = value; i < 5; i++)
                {
                    Thread.Sleep(1000);
                    source.Add(i);
                }
            }
            return "OK";
        }

        public List<int> GetDataSource()
        {
            return source;
        }
    }

客户端调用:

GetData接口时,Service1对象创建第一次,source 被初始化一次。

GetDataSource接口时,Service1对象创建第二次,source再被初始化一次。

posted on 2017-08-24 15:04  kiss88  阅读(231)  评论(0编辑  收藏  举报