目前我正在缓存 ServiceChanclefatory
, 每次我需要时都会创建一个新的 ServiceChannel
。 我期望垃圾收集器会处置 ServiciceChannel
。 但是, 工厂会保存每个频道的引用, 以便当您调用 ServiciceFactoryChannel.Close ()
时, 关闭频道。 这导致许多旧频道的运行, 直至一切都停止工作为止 。
我怎么能把工厂藏起来 还要让垃圾收集者 处理我的频道呢?
我的代码看起来是这样的:
public class ServiceChannel
{
// Returns a ServiceChannel
public static TService Get<TService>()
{
var factory = GetChannelFactory<TService>();
string url = GetEndpoint<TService>();
var endPoint = new EndpointAddress(url);
return factory.CreateChannel(endPoint);
}
// Returns a ServiceChannelFactory, preferably from the cache
public static ChannelFactory<TService> GetChannelFactory<TService>()
{
var cacheKey = string.Format("MyProduct.Library.ServiceChannel.GetChannelFactory<{0}>()", typeof(TService));
var cache = HttpRuntime.Cache;
var factory = cache[cacheKey] as ChannelFactory<TService>;
if (factory == null)
{
factory = GetChannelFactoryUncached<TService>();
cache.Insert(cacheKey, factory);
}
return factory;
}
}