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再被初始化一次。