У меня есть служба Windows, написанная на С#, которая создает множество потоков и устанавливает множество сетевых подключений (WMI, SNMP, простой TCP, http). При попытке остановить службу Windows с помощью оснастки Services 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 интересно проверить. Опять же, как я могу узнать, есть ли у меня какие-либо потоки forground, работающие вокруг? Мне придется проверить каждый раздел кода, который создает поток. Есть ли другой способ, может быть, инструмент, который может помочь мне это выяснить.
Однако в конечном итоге процесс останавливается. Казалось бы, мне нужно чего-то ждать. Однако, если я подожду в методе OnStop в течение X времени, процесс остановится примерно через 30 секунд + X. Независимо от того, что я пытаюсь сделать, кажется, что процессу требуется примерно 30 секунд (это не всегда 30 секунд, это может варьироваться) после возврата OnStop, чтобы процесс фактически остановился.