c# – 尝试重新启动线程时发生ThreadStateException

前端之家收集整理的这篇文章主要介绍了c# – 尝试重新启动线程时发生ThreadStateException前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
尝试重新启动线程时,我不时会收到System.Threading.ThreadStateException.有问题的代码如下:
// Make sure the thread is done stopping
while (this.mThread.ThreadState == ThreadState.Running)
{ 
    Thread.Sleep(0);
}
// Respawn a thread if the current one is stopped or doesn't exist
if (this.mThread == null || this.mThread.ThreadState == ThreadState.Stopped)
{ 
    this.mThread = new Thread(new ParameterizedThreadStart(Monitor)); }
// Start the thread
if (check)
{ 
    this.mThread.Start(60000); 
}
else
{   
    this.mThread.Start(0); 
}

所以有两个问题 – 这是正确的做事方式,而且,是否有办法防止错误发生?

解决方法

问题是你有代码首先检查它是否应该创建一个新的线程对象,另一段代码确定是否可以启动线程对象.由于竞争条件和类似的事情,您的代码可能最终尝试在现有线程对象上调用.Start.考虑到你没有在check变量后面发布细节,就不可能知道什么可能触发这种行为.

您应该重新组织代码,以便保证仅在新对象上调用.Start.简而言之,您应该将Start方法放入与创建新线程对象的if语句相同的if语句中.

就个人而言,我会尝试重新组织整个代码,这样我就不需要创建另一个线程,而是将代码包含在循环内的线程对象中,以便线程继续运行.

猜你在找的C#相关文章