1
當前我緩存ServiceChannelFactory
並創建一個新的ServiceChannel
每當我需要一個。我預計ServiceChannels
將由垃圾收集器處置。但是,工廠會保留每個通道的參考,以便在撥打ServiceFactoryChannel.Close()
時可以關閉該通道。這導致許多舊頻道仍然活着,直到一切停止工作。如何在緩存ServiceChannelFactory時避免ServiceChannel泄漏?
如何緩存工廠並讓垃圾收集器處理我的渠道?
我的代碼如下所示:
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;
}
}
你能否詳細說明*一切都停止工作*?你應該通過什麼方式分享你的緩存(*代碼是有用的*),例如你是否使用滑動過期,內存緩存等 – SliverNinja
我一直在創建頻道。每個通道都保持一個輸出端口打開,所以一段時間後這些端口都用完了。結果是服務器不能再建立新的TCP連接。 – Sjoerd