Сегодня у меня возникла проблема с 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 и создание так много потоков может вызвать проблемы с производительностью).