0

下一段代码抛出 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(Boolean value)
在 MyNamespace.MyClass.StartListening()
...

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

4

1 回答 1

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 }
}
于 2014-05-20T07:09:03.227 回答