Разрабатываю сервер на 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.
Умерла, значит умерла... Если нужно запустить новый поток, так создайте новый поток.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей