C# Повторный запуск потоков

200
07 мая 2018, 21:41

Разрабатываю сервер на C#. У меня есть интерйфейс, и вся основная сетевая работа выполняется в отдельном потоке. Интерфейсом я управляю состоянием сервера и высматриваю подключенных клиентов.

Суть.

Есть поток, отвечающий за сетевое взаимодействие:

static Thread listener = new Thread(() =>
        {
            while (currentStatus == Status.on)
            {
                // some work
            }
        });

Как вы видите, он работает только пока currentStatus == Status.on. Этот currentStatus я меняю кнопкой интерфейса. И при запуске, т.е. когда currentStatus становится Status.on я запускаю поток listener.Start().

Когда я выключаю сервер, т.е. когда currentStatus становится Status.off, поток по идее уже отработал свой код и вырубился.

В дальнейшем, если мне необходимо, допустим, снова запустить сервер, поток выбрасывает ThreadStateException: 'Поток выполняется или прерван; его нельзя запустить повторно.'

Это уничтожает мой мозг, т.к. в моём понимании, отработавший поток должен перейти в то состояние, из которого его можно запустить снова.

Так вот, уважаемые аноны, вопрос:

Как проще всего осуществить перезапуск потока?

Answer 1

Вам не нужно перезапускать поток, по-хорошему нужно сделать так:

var evt = new AutoResetEvent(true);
Thread listener = new Thread(() =>
{
    while (true)
    {
        evt.WaitOne();
        while (currentStatus == Status.on)
        {
            // some work
        }
    }
});

Если вам нужно запустить внутренний цикл, вы просто вызываете:

evt.Set();

Если поток находится на строчке evt.WaitOne(); он потребляет примерно ноль ресурсов CPU.

В этом случае желательно поток отметить как дочерний (IsBackground = true), так как без этого поток может не завершиться с завершением основного потока приложения и тем самым может помешать умереть процессу

Answer 2

Из документации (Состояния управляемых потоков):

Если поток был выведен из состояния Unstarted в результате вызова метода Start, он не может вернуться в состояние Unstarted ни при каких условиях. Поток никогда не может выйти из состояния Stopped.

Дополнительно можно почитать Состояния потока. Оригинал: ThreadState.

Умерла, значит умерла... Если нужно запустить новый поток, так создайте новый поток.

READ ALSO
Замена текста и печать в C#

Замена текста и печать в C#

У меня вопросКак мне с помощью C# создать к примеру текстовый документ по определенному шаблону, и отправить его на печать, заменяя переменные...

171
Шифрование ECDSA с кривой brainpoolP160r1

Шифрование ECDSA с кривой brainpoolP160r1

Никак не могу реализовать или найти реализованный алгоритм шифрования ECDSA с параметрами кривой brainpoolP160r1

129
Access и символ новой строки

Access и символ новой строки

Делаю вставку изNET в MS Access

134