rjz*_*zii 6 .net c# multithreading exception
尝试重新启动线程时,我不时会收到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);
}
Run Code Online (Sandbox Code Playgroud)
所以有两个问题 - 这是正确的做事方式,而且,是否有办法防止错误发生?
一个线程可能同时处于多个状态,因此ThreadState属性实际上是可能状态的位图.因此,只用一个状态来测试相等性就不会给你正确的结果.您需要执行以下操作:
if((mThread.ThreadState & ThreadState.Running) != 0)
Run Code Online (Sandbox Code Playgroud)
但是,检查线程状态是做错的.我并不完全清楚你想要实现的目标,但我猜你正在等待一个线程在重新启动之前终止.在这种情况下,你应该这样做:
mThread.Join();
mThread = new Thread(new ParameterizedThreadStart(Monitor));
if(check)
mThread.Start(60000);
else
mThread.Start(0);
Run Code Online (Sandbox Code Playgroud)
虽然如果你描述你想要更详细解决的问题,我几乎可以肯定会有更好的解决方案.等待一个线程结束只是为了重新启动它对我来说似乎并不高效.也许你只需要某种线程间的通信?
约翰.
问题是您的代码首先检查是否应该创建新的线程对象,还有另一段代码确定是否启动线程对象。由于竞争条件和类似的事情,您的代码最终可能会尝试在现有线程对象上调用 .Start 。考虑到您没有在检查变量后面发布详细信息,因此不可能知道什么可能会触发此行为。
您应该重新组织代码,以便保证仅在新对象上调用 .Start。简而言之,您应该将 Start 方法放入与创建新线程对象相同的 if 语句中。
就我个人而言,我会尝试重新组织整个代码,以便不需要创建另一个线程,而是将代码包装在循环内的线程对象内,以便线程继续运行。
| 归档时间: |
|
| 查看次数: |
7029 次 |
| 最近记录: |