在使用WCF服务时,每次使用时创建新实例好还是创建一个实例并重复使用它更好?为什么这两种方法哪个更好?对于异步代理来说是否相同?
创建新的服务实例每次都会消耗一些系统资源,而且创建和销毁实例也需要一定的时间。因此,在高负载情况下,重复使用同一个实例可以提高性能并减少资源消耗。但是,如果服务实例持有状态(Stateful),则必须小心使用,并确保在使用之前正确初始化它们。对于异步代理,最好采用与同步调用相同的方法来处理服务实例。重复使用异步代理实例可以提高性能并减少资源消耗。
创建一个并重复使用它是否更好?
不要开始实现自己的池化实现。这已经在框架中完成了。WCF代理使用缓存的通道工厂。因此,创建新代理不会过度昂贵(但请参见Guy Starbuck有关会话和安全性的回复!)。
还要注意,代理在一定的空闲时间后会超时(默认为10分钟)。
如果您想要更明确的控制,可以考虑直接使用ChannelFactories和通道,而不是“易于使用,开箱即用”的ClientBase代理。
还有一个需要考虑的问题是通道故障。按照设计,WCF不允许在未处理异常发生后继续使用客户端代理。
IMyContract proxy = new MyContractClient( );
try
{
proxy.MyMethod( );
}
catch
{}
//Throws CommunicationObjectFaultedException
proxy.MyMethod( );