Thread.IsBackground создает исключение ThreadStateException
Следующий фрагмент кода вызывает исключение ThreadStateException:
public void StartListening()
{
this.isListening = true;
if (!this.listeningThread.IsAlive)
this.listeningThread = new Thread(ListenForClients);
this.listeningThread.Start();
this.listeningThread.IsBackground = true;
}
И при установке свойства IsBackground
this.listeningThread.IsBackground = true;
исключение брошено.
В чем дело? Я использую IsBackground=true в неправильном месте?
Текст исключения:
Поток мертв; состояние не может быть доступно.
в System.Threading.Thread.SetBackgroundNative(логическое значение isBackground)
в System.Threading.Thread.set_IsBackgrounf(логическое значение)
в MyNamespace.MyClass.StartListening ()
...
Свойство IsBackground установлено только в одном месте, здесь. Таким образом, это никогда не изменяется во время работы потока. К сожалению, я не могу воспроизвести это (воспроизводится только в системе клиента), поэтому я не знаю причину. И вот почему я спрашиваю.
1 ответ
Основная причина, по которой вы получаете ошибку, заключается в том, что в тот момент, когда вы установили this.listeningThread.IsBackground = true
нить уже мертва
Позволь мне объяснить:
this.isListening = true;
if (!this.listeningThread.IsAlive)// thread is alive
this.listeningThread = new Thread(ListenForClients);
this.listeningThread.Start();// thread is alive, still ..
// thread completes here
// you might add some delay here to reproduce error more often
this.listeningThread.IsBackground = true;
Я не знаю полного контекста задачи, но я думаю, что имеет смысл изменить код на:
public void StartListening()
{
this.isListening = true;
if (!this.listeningThread.IsAlive)
{
this.listeningThread = new Thread(ListenForClients);
this.listeningThread.IsBackground = true;
this.listeningThread.Start();
}
// else { do nothing as it's already alive }
}