현재 캐시가 필요할 때마다 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