Thread.IsBackground抛出ThreadStateException

时间:2014-05-20 06:54:43

标签: c# multithreading thread-exceptions

下一段代码抛出一个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(Boolean isBackground)
  在System.Threading.Thread.set_IsBackgrounf(布尔值)
  在MyNamespace.MyClass.StartListening()
  ...

IsBackground属性仅在一个地方设置,此处。因此,它在线程工作期间永远不会改变。不幸的是我无法重现这一点(仅在客户端系统上复制),所以我不知道原因。这就是我要问的原因。

1 个答案:

答案 0 :(得分:6)

你收到错误的最主要原因是因为你设置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 }
}