У меня есть ServiceHost в сервисном приложении, которое обменивается данными с 1700 клиентами каждые 60 секунд.Когда я запускаю службу, она почти сразу достигает 1500 открытых дескрипторов, а затем продолжает добавлять еще 300 через 5 минут (и продолжает непрерывно после этого.)
Я посмотрел на ProcessExplorer и в SplitПо его мнению, он показывает сотни дескрипторов типа File с именем «Device \ Afd», который является представителем сокета TCP, используемого для связи (я полагаю).
Я только предполагаю, что утечка моего дескриптора связана с ServiceHost, поскольку она представляет наибольшее количество дескрипторов, наблюдаемых в Process Explorer.Мне интересно, почему служба не закрывает их?Нужно ли устанавливать какое-то время ожидания или мне нужно где-нибудь самостоятельно активно их закрывать?
Вот как создается мой ServiceHost:
wcfObject = new WcfObject();
host = new ServiceHost(wcfObject, baseWcfAddress);
ServiceBehaviorAttribute attribute = (ServiceBehaviorAttribute)host.Description.Behaviors[typeof(ServiceBehaviorAttribute)];
attribute.ConcurrencyMode = ConcurrencyMode.Multiple;
attribute.InstanceContextMode = InstanceContextMode.Single;
И в моем app.config:
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<services>
<service name="WcfObject" behaviorConfiguration="DefaultBehavior">
<host>
<baseAddresses >
<!-- Defined in code -->
</baseAddresses>
</host>
<endpoint name="NetTcpEndPoint" address="" binding="netTcpBinding" bindingConfiguration="netTcpBinding" contract="IWcfObject"/>
<endpoint name="NetTcpMetadataPoint" address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
</service>
</services>
<bindings>
<netTcpBinding>
<binding name="netTcpBinding" maxReceivedMessageSize="9655360" maxBufferSize="9655360" maxBufferPoolSize="524288">
<readerQuotas maxArrayLength = "932000" maxStringContentLength="900000" maxDepth="32"/>
<security mode="None"></security>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="DefaultBehavior" >
<serviceMetadata httpGetEnabled="False" httpGetUrl="" />
<serviceDebug includeExceptionDetailInFaults="True"/>
<serviceThrottling maxConcurrentCalls="50" maxConcurrentSessions="100" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>