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 }
}
Другие вопросы по тегам