Вы должны понимать, как работают потоки, по крайней мере, в CE (и, вероятно, на рабочем столе).Обычно, когда основной (входной) поток процесса завершает работу, планировщик ОС получает уведомление, и все его рабочие потоки планируются для завершения.В следующий раз, когда эти потоки запросят квант (часть времени обработки), они будут уничтожены - и это важный бит.
Если фоновый поток «застрял» в блокирующем вызове ОС (например, WaitForSingleObject(INFINITE)
) тогда этот поток никогда не будет запрашивать квант у планировщика.Если у планировщика никогда не запрашивается время для запуска потока, потоку никогда не предоставляется возможность фактически завершить работу.
Это основная причина того, что рабочие потоки должны всегда иметь время ожидания вих циклы активности (я бы сказал, что если вы когда-нибудь используете бесконечное время ожидания, вы, вероятно, ошиблись).Даже если тайм-аут возвращается и ждет снова, это дает планировщику возможность уничтожить поток.
Вы можете попробовать использовать API-интерфейсы toolhelp для завершения процесса (который IIRC приостановит и возобновит рабочие потоки, даваяу планировщика есть шанс сделать свою работу).Я не уверен, что это сработает, но P / Invoke довольно легко попробовать.