У нас есть настольное приложение WinForms, которое является многопоточным.3 потока работают с Application.Run и кучей других фоновых рабочих потоков.Правильно закрыть все потоки было довольно сложно, но я подумал, что наконец-то все понял.
Но когда мы действительно развернули приложение, пользователи начали испытывать, что приложение не закрывается.Существует System.Threading.Mutex, который запрещает им запускать приложение несколько раз, поэтому им нужно зайти в диспетчер задач и убить старый, прежде чем они смогут запустить его снова.
Каждый поток получает Thread.Joinперед выходом из основного потока, и я добавил запись в каждый поток, который я создал.Согласно журналу, каждый отдельный поток, который запускается, также завершается, и основной поток также завершается.Даже более странный запуск SysInternals ProcessExplorer показывает, что все потоки исчезают при выходе из приложения.Например, есть 0 потоков (управляемых или неуправляемых), но процесс все еще выполняется.
Я не могу воспроизвести это ни на компьютерах разработчиков, ни в нашей тестовой среде, и пока я только видел этопроизойдет в Windows XP (не Vista, Windows 7 или Windows Server).Как процесс может продолжать работать с 0 потоками?
Редактировать:
Вот немного подробнее.Одним из циклов событий является размещение библиотеки взаимодействия Win32, которая использует COM-объект для связи с драйвером устройства.Я поместил его в свой собственный поток, потому что драйвер устройства чувствителен ко времени, и всякий раз, когда поток пользовательского интерфейса будет блокироваться в течение значительного времени (например, в ожидании завершения вызова базы данных), он будет мешать драйверу устройства.
Итак, я изменил код, чтобы основной поток делал Thread.Join с потоком драйвера устройства.Это фактически вызвало блокировку приложения ... оно регистрирует еще несколько вызовов в потоке пользовательского интерфейса после завершения соединения, а затем все останавливается.Если устройство выключено, драйвер никогда не запускается, и проблема исчезает.Таким образом, похоже, что драйвер должен отвечать за поддержание приложения в рабочем состоянии, даже после того, как оно предположительно было закрыто.