2016-09-27 1 views
0

Сегодня у меня возникла проблема с Windows Service.Метод OnStop на службе Windows не вызывается, если есть задачи, пытающиеся получить доступ к недоступной службе WCF.

Служба сама работает отлично уже более года, и основная задача - обслуживать TCP-клиентов с потоком данных.

Недавно я добавил звонки в службу WCF, чтобы отправить некоторую информацию о потоках данных.

Чтобы предотвратить эту WCF звонков с сильно влиять на уже существующую логику, я использовал

Task.Run(() => { 
    using(var proxy = new WCFProxy("configurationName")) 
    { 
     proxy.WCFClientMethod() 
    } 
}); 

Это хорошо работает, но я заметил, что окна обслуживание застревает в состоянии остановки, если я попытаюсь остановить его с помощью services.msc в то время как удаленная служба WCF недоступна.

Остановка обслуживания успешна, если доступна удаленная служба WCF или когда она становится доступной во время работы службы Windows в состоянии остановки.

После некоторой отладки выяснилось, что метод OnStop не вызывается.

Я нашел несколько статей в Интернете о методе OnStop, который не вызывается до тех пор, пока все задачи в ThreadPool не будут завершены. Но я не уверен, что это имеет какое-то отношение к этой проблеме, главным образом потому, что задачи AFAIK в ThreadPool должны закончить в любом случае, независимо от того, являются ли они faulted(EndpointNotFoundException) или нет.

Я был бы признателен за любые идеи по устранению этой проблемы (используя Thread вместо Task.Run не является хорошим вариантом, так как есть много вызовов службы WCF и создание так много потоков может вызвать проблемы с производительностью).

ответ

0

только что решил мою проблему.

Обнаружено, что вызовы WCF блокировали фактические задачи в ThreadPool , что вызвало вызов метода OnStop, который застревает в очереди.

Я делал вызовы WCF асинхронными с async/await, и теперь все работает сглаженно.