@Ramirag
Я человек.

Как приостановить или убить дочерний поток в C#?

У меня есть дочерний поток, который что-то там делает в бесконечном цикле.
В какой-то момент времени мне надо:
1. Убить дочерний поток. Сейчас я делаю нечто подобное
private Thread _thread;
        private Boolean _isWorking;
        private void DoWork()
        {
            while(_isWorking)
            {
                Console.WriteLine("SomeWork");
                Thread.Sleep(1000);
            }
        }

        public void Start()
        {
            _thread = new Thread(DoWork);
            _isWorking = true;
            _thread.Start();
        }

        public void Stop()
        {
            _isWorking = false;
            while (_thread.ThreadState != ThreadState.Stopped)
                Thread.Sleep(100);
        }

Я знаю про метод Abort, но он может вызвать утечку ресурсов. Может быть есть более разумный метод без постоянной проверки флага?
2. Заморозить дочерний поток на бесконечно большее время. Можно как вариант сделать еще одну проверка флага и если она проходит, то войти в AutoResetEvent. А что бы разбудить поток, то сбрасываем AutoResetEvent. Еще есть вариант делать бесконечный сон, а для пробуждения использовать Interrupt. Но тут опять же выходит постоянная проверка флага.
  • Вопрос задан
  • 6254 просмотра
Решения вопроса 1
@mayorovp
Для проверки на завершение внутри потока хорошо использовать ManualResetEvent, на нем же и ожидая:

private void DoWork()
        {
            do
            {
                Console.WriteLine("SomeWork");
            } while (!closeEvent.WaitOne(1000));
        }


Ну я для того, чтобы дождаться завершения потока, существует метод Join
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
AxisPod
@AxisPod
Поглядите на BackgroundWorker. Ну и в текущем примере, вместо ожидания остановки используйте метод Thread.Join(), текущий поток будет ждать пока ваш останавливаемый поток не завершится.
Ответ написан
@Nubzilo
Изучаю C#
А вот как советует останавливать поток MSDN - How to: Create and Terminate Threads
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы