У меня есть приложение, которое выполняет некоторую фоновую задачу (прослушивание сети &) в отдельном Thread
. Однако, похоже, что нить не прерывается/отменяется, когда я закрываю приложение (нажмите кнопку «x» на панели заголовка). Это потому, что основная программа Thread - while(true) {...}
? Какое здесь решение? Я искал некоторый флаг прерывания для Thread как условие для цикла while, но не нашел.Нить не прерывается при закрытии приложения
ответ
Самый простой способ - установить для свойства IsBackground потока значение true. Это предотвратит сохранение приложения. Приложение завершается, когда все нефонические потоки завершаются.
Более контролируемый способ остановить поток - отправить сообщение, чтобы оно было закрыто, и убедитесь, что оно завершено, прежде чем разрешить основной поток.
Метод, который я бы не рекомендовал, - позвонить по телефону Thread.Abort
. У этого есть ряд проблем, один из которых заключается в том, что не гарантируется прекращение потока. Из документации:
Вызов этого метода обычно завершает нить.
Emphasis mine.
Ну, а while(true)
, может быть, вы должны:
while(appIsRunning)
{
}
И в случае закрытия для формы,
appIsRunning = false;
thread.Join(2000);
, где последняя строка просто чтобы убедиться, что вы ждете нить для чистовой обработки. Есть много других способов заставить конец потока, но проблема только в этом: вы не хотите быть , заставляя вещи, вы хотите, чтобы они происходили как можно естественнее.
После соединения вы можете проверить статус потока, чтобы узнать, завершено ли оно. Если это не так, затем (и только тогда) заставит его закончить с прерыванием и может уведомить вашего пользователя (или записать запись журнала), что что-то не закончилось так, как должно.
Да, но не забудьте использовать 'volatile' или' lock' или какой-либо другой метод синхронизации. –
@Mark: может быть, здесь совершенно неправильно, но так как ребенок Thread только читает, а основной поток записывает только, есть ли шанс на ошибку? –
Без синхронизации не гарантируется, что изменение в appIsRunning из одного потока будет видимым в другом потоке. Вы можете прочитать здесь: http://timl.net/2009/03/volatile-memory.html –
Вы могли бы улучшить время (истина), петля для
void DoWork() {
while(!ShouldIQuitManualResetEvent.WaitOne(0)) {
// do something
}
IDidQuitManualResetEvent.Set()
}
немного более изящный, короткий из имен идентификаторов.
Вы всегда можете форсировать:
class Program
{
public static void Main()
{
// ... do stuff
Environment.Exit(Environment.ExitCode);
}
}
Лучше подход установить свойство Thread.IsBackground истина, как Марк уже упоминалось.
Вы можете начать нить, как:
ThreadPool.QueueUserWorkItem(DoStuff, input)
И это будет прервать автоматически с применением закрытия.
- 1. Нить не прерывается
- 2. Нить не прерывается после прерывания
- 3. Нить прерывается в asp.net-приложении
- 4. Почему нить в моем коде не прерывается?
- 5. Нить не прерывается с использованием условного TimerTask
- 6. Сбой приложения при закрытии
- 7. NsmutableArray не удалось сохранить при закрытии приложения
- 8. Память не отображается при закрытии приложения.
- 9. При закрытии приложения закрыты не все окна
- 10. Сохранить данные приложения при закрытии
- 11. Задача iOS при закрытии приложения
- 12. ContentDialog при закрытии окна приложения
- 13. записывать слушателя при закрытии приложения
- 14. Запуск Таймер при закрытии приложения
- 15. Ошибка при закрытии приложения Android
- 16. Получение исключения при закрытии приложения
- 17. метод вызова при закрытии приложения
- 18. Android Ошибка при закрытии приложения
- 19. BackgroundWorker Thread при закрытии приложения
- 20. Завершение приложения при закрытии окна
- 21. Самопроизвольное выполнение приложения прерывается при отладке
- 22. Тупик при закрытии трубы, пока другая нить читает этот трубопровод?
- 23. Триггер событий управления Excel при закрытии приложения
- 24. Сбой приложения C# при закрытии пользовательской формы
- 25. Закрытие неуправляемых ресурсов при закрытии приложения WPF
- 26. Зазор памяти кучи при внезапном закрытии приложения
- 27. Передача намерений передачи при закрытии приложения
- 28. Код для запуска при закрытии приложения
- 29. Концепция Sqlite при открытии и закрытии приложения
- 30. Отслеживать пользователя при закрытии/запуске приложения
+1 к методу сообщения.'while (stayAlive)' вместо 'true' намного чище, даже если это потенциально занимает несколько лишних секунд, чтобы цикл прояснился. – user7116