Приложение не закрывается с 0 потоков - PullRequest
2 голосов
/ 23 апреля 2010

У нас есть настольное приложение WinForms, которое является многопоточным.3 потока работают с Application.Run и кучей других фоновых рабочих потоков.Правильно закрыть все потоки было довольно сложно, но я подумал, что наконец-то все понял.

Но когда мы действительно развернули приложение, пользователи начали испытывать, что приложение не закрывается.Существует System.Threading.Mutex, который запрещает им запускать приложение несколько раз, поэтому им нужно зайти в диспетчер задач и убить старый, прежде чем они смогут запустить его снова.

Каждый поток получает Thread.Joinперед выходом из основного потока, и я добавил запись в каждый поток, который я создал.Согласно журналу, каждый отдельный поток, который запускается, также завершается, и основной поток также завершается.Даже более странный запуск SysInternals ProcessExplorer показывает, что все потоки исчезают при выходе из приложения.Например, есть 0 потоков (управляемых или неуправляемых), но процесс все еще выполняется.

Я не могу воспроизвести это ни на компьютерах разработчиков, ни в нашей тестовой среде, и пока я только видел этопроизойдет в Windows XP (не Vista, Windows 7 или Windows Server).Как процесс может продолжать работать с 0 потоками?

Редактировать:

Вот немного подробнее.Одним из циклов событий является размещение библиотеки взаимодействия Win32, которая использует COM-объект для связи с драйвером устройства.Я поместил его в свой собственный поток, потому что драйвер устройства чувствителен ко времени, и всякий раз, когда поток пользовательского интерфейса будет блокироваться в течение значительного времени (например, в ожидании завершения вызова базы данных), он будет мешать драйверу устройства.

Итак, я изменил код, чтобы основной поток делал Thread.Join с потоком драйвера устройства.Это фактически вызвало блокировку приложения ... оно регистрирует еще несколько вызовов в потоке пользовательского интерфейса после завершения соединения, а затем все останавливается.Если устройство выключено, драйвер никогда не запускается, и проблема исчезает.Таким образом, похоже, что драйвер должен отвечать за поддержание приложения в рабочем состоянии, даже после того, как оно предположительно было закрыто.

Ответы [ 3 ]

1 голос
/ 23 апреля 2010

Когда вы создаете свои потоки, установите IsBackground = true для них.Когда ваш основной поток / приложение закрыто, все созданные потоки автоматически закрываются.

http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground.aspx

0 голосов
/ 22 октября 2010

Мы никогда не выясняли основную программную причину, но именно конкретная версия драйвера вызывала проблему, и обновление до нового драйвера решало проблему.

К сожалению, это все, что я могу дать, если кто-нибудь когда-нибудь столкнется с подобной проблемой ...

0 голосов
/ 23 апреля 2010

Возможно ли, что дочерние элементы вашего Application.Run звонки не прекращаются?Кроме того, что на самом деле заставляет приложение закрываться - оно автоматически закрывается, когда завершаются все потоки (автоматически означает, что вы написали некоторый код для этого), или это имитируется пользователем?

Однажды у меня возникла проблемагде в моем коде события "Завершение потока" было условие гонки, которое иногда приводило к тому, что вы видите.Последние два потока завершатся в одно и то же время, запустят событие одновременно, и каждое событие решит, что это не последний поток, поэтому приложение продолжит работу, даже если число потоков было равно нулю.Чтобы решить эту проблему, я смог найти и устранить условие гонки, но вы также можете использовать таймер, который проверяет каждую секунду или две, получает количество потоков и, если ни один из них еще не открыт, это убивает приложение.

...