2012-05-24 50 views
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; 
    } 
} 
+0

你能否詳細說明*一切都停止工作*?你應該通過什麼方式分享你的緩存(*代碼是有用的*),例如你是否使用滑動過期,內存緩存等 – SliverNinja

+0

我一直在創建頻道。每個通道都保持一個輸出端口打開,所以一段時間後這些端口都用完了。結果是服務器不能再建立新的TCP連接。 – Sjoerd

回答

1

你可以使用一個IoC容器像Autofac /團結/ Ninject,或者一個非常基本的,但快一個使用DynamoIOC。

設置容器時,請對ServiceChannelFactory進行一次引用。當你創建一個IServiceChannel(給你的服務IMyService)時,也要註冊它。

但要小心,當您的IServiceChannel.Faulted事件被擊中時,您將需要關閉,處置並重新創建它,並將其添加回IoC容器中。這樣,無論何時調用者需要訪問您的服務,它都將處於非故障狀態。