下一段代码抛出一个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属性仅在一个地方设置,此处。因此,它在线程工作期间永远不会改变。不幸的是我无法重现这一点(仅在客户端系统上复制),所以我不知道原因。这就是我要问的原因。
答案 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 }
}