Разрабатываю сервер на 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: 'Поток выполняется или прерван; его нельзя запустить повторно.'
Это уничтожает мой мозг, т.к. в моём понимании, отработавший поток должен перейти в то состояние, из которого его можно запустить снова.
Так вот, уважаемые аноны, вопрос:
Как проще всего осуществить перезапуск потока?
Вам не нужно перезапускать поток, по-хорошему нужно сделать так:
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
), так как без этого поток может не завершиться с завершением основного потока приложения и тем самым может помешать умереть процессу
Из документации (Состояния управляемых потоков):
Если поток был выведен из состояния Unstarted в результате вызова метода Start, он не может вернуться в состояние Unstarted ни при каких условиях. Поток никогда не может выйти из состояния Stopped.
Дополнительно можно почитать Состояния потока. Оригинал: ThreadState.
Умерла, значит умерла... Если нужно запустить новый поток, так создайте новый поток.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
У меня вопросКак мне с помощью C# создать к примеру текстовый документ по определенному шаблону, и отправить его на печать, заменяя переменные...
Есть COM SDK одной программы (4-еdll-ки)
Никак не могу реализовать или найти реализованный алгоритм шифрования ECDSA с параметрами кривой brainpoolP160r1