一ThreadStateException发生的,当试图重新启动一个线程
-
08-06-2019 - |
题
有时我得到一个系统。穿线。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);
}
所以两个问题-这是正确的做事方式,是的,是有一个方法,以防止发生错误?
解决方案
问题是你们的代码,第一次检查,如果它应创建一个新的线对象,另一段代码,以确定是否启动线的对象。由于竞赛的条件和类似的事情,你的代码最终可能会试图呼叫。开始在现有线的对象。考虑到你不后的细节的背后 检查 可变的,它不可能知道什么可能触发这种行为。
你应该重新组织的代码这样。开始是保证只能被称为新的对象。总之,你应该把启动方法为相同的,如果声明作为一个创造一个新的线的对象。
就个人而言,我将尝试重组的整个码所以我不需要另外创建一个线程,但是包裹内代码线对象内的一个循环,使该线只保持下去。
其他提示
这有可能对一个线程是在不止一个国家一次,因此ThreadState的财产其实是一位可能的国家。所以检测对平等只是一种状态不会给你正确的结果。你会需要做的事情,如:
if((mThread.ThreadState & ThreadState.Running) != 0)
然而,检查螺纹状态是错误的做任何事情。我不完全清楚你想要什么实现,但我猜,你在等待一个线程终止之前重新启动。在这种情况下,你应该做的:
mThread.Join();
mThread = new Thread(new ParameterizedThreadStart(Monitor));
if(check)
mThread.Start(60000);
else
mThread.Start(0);
虽然如果你描述的问题你试图解决更详细的我几乎肯定会有一个更好的解决方案。等待一个线程的结束,只是为重新启动,它再次似乎没有有效的给我。也许你只是需要某种形式的间线通信?
约翰。
一ThreadStateException引是因为你试图开始一个线程,不是一个启动的状态。最可能的情况是,它已经运行,或者说它已完全退出。
有可能是一对夫妇的事情可能发生。第一是,线可能具有转变,从运行StopRequested,它并不是完全停止呢,所以你的逻辑不会创建一个新的螺纹,你是试图启动一个线程刚刚完成运行或即将结束运行(无论其中是一个有效的国家重新启动).
其他的可能性是,该线被中止。螺纹其是中止去中止状态,不停止状态,并且当然也不适用于重新启动。
真的,只有一种螺纹也就是还活着,可以"重新启动"是一个暂停。你可能想要使用这种有条件的,而不是:
if (this.mThread == null || this.mThread.ThreadState != ThreadState.Suspended)