Kill не убивает процесс - PullRequest
       23

Kill не убивает процесс

1 голос
/ 03 марта 2012

Кто-нибудь сталкивался с попыткой убить приложение на устройстве Windows Mobile 5?

Это приложение winforms .net 3.5, в котором есть несколько фоновых потоков, которые, кажется, не очищаются должным образом при возникновении исключения. Который, я полагаю, является тем случаем, когда также производится убийство. И поэтому в обоих случаях процесс зависает при отображении около 3 фоновых потоков, и он просто не исчезнет без перезагрузки.

Есть ли способ устранить такой процесс, кроме как на самом деле исправить ошибки в коде?

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

Вы должны понимать, как работают потоки, по крайней мере, в CE (и, вероятно, на рабочем столе).Обычно, когда основной (входной) поток процесса завершает работу, планировщик ОС получает уведомление, и все его рабочие потоки планируются для завершения.В следующий раз, когда эти потоки запросят квант (часть времени обработки), они будут уничтожены - и это важный бит.

Если фоновый поток «застрял» в блокирующем вызове ОС (например, WaitForSingleObject(INFINITE)) тогда этот поток никогда не будет запрашивать квант у планировщика.Если у планировщика никогда не запрашивается время для запуска потока, потоку никогда не предоставляется возможность фактически завершить работу.

Это основная причина того, что рабочие потоки должны всегда иметь время ожидания вих циклы активности (я бы сказал, что если вы когда-нибудь используете бесконечное время ожидания, вы, вероятно, ошиблись).Даже если тайм-аут возвращается и ждет снова, это дает планировщику возможность уничтожить поток.

Вы можете попробовать использовать API-интерфейсы toolhelp для завершения процесса (который IIRC приостановит и возобновит рабочие потоки, даваяу планировщика есть шанс сделать свою работу).Я не уверен, что это сработает, но P / Invoke довольно легко попробовать.

0 голосов
/ 03 марта 2012

Отслеживает ли ваше приложение фоновые потоки, которые оно использует? Я знаю, что в приложении для форм Windows создание исключений и уничтожение основного потока приложения могут оставить фоновые потоки работающими, даже если вы уничтожите приложение в целом. Если приложение отслеживает, вы можете явно уничтожить фоновые потоки как часть обработки исключений до сбоя приложения.

В противном случае вы можете периодически проверять фоновые потоки, чтобы убедиться, что основное приложение все еще работает, а если нет, попросить их убить себя. Не совсем так чисто, но другая возможность.

...