У меня есть служба WCF (встроенная .NET Framework 3.5), размещенная на IIS 6.0.
Поток кода выглядит следующим образом
- Клиент (который является другим веб-сервисом) вызывает службу WCF
- Службы WCF вызывают поток для обработки в фоновом режиме и немедленно реагируют на вызываемого абонента.
- Фоновый поток после завершения всей обработки вызывает обратный поток. Этот вызов в основном является запросом HTTP, поскольку клиент является веб-службой.
Я загружаю свою службу WCF для определения пороговых значений. Наблюдение выглядит следующим образом:
Примерно три итерации 1024 запросов, сделанных в службу WCF за 1 минуту, проходят успешно. Время, затраченное на выполнение каждой итерации, составляет около 25-30 минут. Однако из 4-го итерационного сбоя. Около 50% запросов терпят неудачу с приведенным ниже исключением.
Исключение-Thread прерывается.
Трассировка стека
21_10_2016_09_30_52,9:30:52 AM,Information,Thread name- apSwTTbLTETfwT3y Stack trace in ProcessTestConversion method - at System.Threading.WaitHandle.WaitOneNative(SafeHandle waitableSafeHandle, UInt32 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
at System.Threading.WaitHandle.InternalWaitOne(SafeHandle waitableSafeHandle, Int64 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
at System.Threading.WaitHandle.WaitOne(Int32 millisecondsTimeout, Boolean exitContext)
at System.Net.LazyAsyncResult.WaitForCompletion(Boolean snap)
at System.Net.Connection.SubmitRequest(HttpWebRequest request, Boolean forcedsubmit)
at System.Net.ServicePoint.SubmitRequest(HttpWebRequest request, String connName)
at System.Net.HttpWebRequest.SubmitRequest(ServicePoint servicePoint)
at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
.
.(My function calls stack trace)
.
.
Изменения, которые я попытался решить, следующие проблемы:
<behavior>
<serviceThrottling maxConcurrentCalls="2000"
maxConcurrentInstances ="2400"
maxConcurrentSessions ="400"/>
</behavior>
в web.config
<system.web>
<compilation debug="false" />
<httpRuntime executionTimeout="1800"/>
</system.web>
в web.config
<system.net>
<connectionManagement>
<add address = "*" maxconnection = "100" />
</connectionManagement>
</system.net>
в web.config
ServicePointManager.DefaultConnectionLimit = 100; (Change in code)
Я установил свойство IdleTimeout для пула приложений равным 0, как было предложено многими людьми в StackOverflow.
Когда бы ни использовались потоки, я располагался во всех местах. Итак, все потоки закрыты.
Может ли кто-нибудь сказать мне, кто прерывает потоки и почему и есть ли какие-либо средства или инструмент для отслеживания причины инициирования прерывания потока?