У меня есть служба Windows, написанная на С#, которая создает нагрузку на грузовик потоков и делает много сетевых соединений (WMI, SNMP, простой TCP, http). При попытке остановить службу Windows с помощью оснастки "Сервис" MSC вызов для остановки службы возвращается относительно быстро, но процесс продолжает работать примерно 30 секунд или около того.
Основной вопрос заключается в том, что может быть причиной остановки 30 секунд. Что я могу найти и как его искать?
Вторичный вопрос заключается в том, почему возвращается сервисная msc-привязка (диспетчер услуг), хотя процесс все еще работает. Есть ли способ заставить его вернуться только тогда, когда процесс фактически убит?
Вот код в методе OnStop службы
protected override void OnStop()
{
//doing some tracing
//......
//doing some minor single threaded cleanup here
//......
base.OnStop();
//doing some tracing here
}
Редактировать в ответ на ответы очистки темы
Многие из вас ответили, что я должен следить за всеми моими нитями, а затем очищать их. Я не думаю, что это практический подход. Во-первых, у меня нет доступа ко всем управляемым потокам в одном месте. Программное обеспечение довольно большое с различными компонентами, проектами и даже сторонними DLL файлами, которые могут создавать потоки. Я не могу отслеживать их всех в одном месте или иметь флаг, который проверяет все потоки (даже если бы я мог проверять все потоки во всех потоках, многие потоки блокируют такие вещи, как семафоры. Когда они блокируют, они могут Проверьте, я должен заставить их ждать с таймаутом, затем проверить этот глобальный флаг и ждать снова).
Флаг IsBackround - интересная вещь для проверки. Опять же, как я могу узнать, есть ли у меня какие-то фоновые потоки, работающие вокруг? Мне нужно будет проверить каждый раздел кода, который создает поток. Есть ли другой способ, может быть, инструмент, который может помочь мне найти это.
В конечном счете, процесс прекращается. Казалось бы, мне нужно что-то ждать. Однако, если я жду в методе OnStop для X времени, то для этого процесс занимает около 30 секунд + X для остановки. Независимо от того, что я пытаюсь сделать, кажется, что процесс требует приблизительно 30 секунд (его не всегда 30 секунд, он может меняться) после того, как OnStop вернется, чтобы процесс фактически остановился.