2008-08-16 20 views
6

スレッドを再起動しようとするとSystem.Threading.ThreadStateExceptionが発生することがあります。エラーの発生を防止するための方法があり、これは物事の正しい方法であり、それは -スレッドを再起動しようとすると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); 
} 

ように、2つの質問に次のように問題のコードはありますか?

答えて

3

問題は、新しいスレッドオブジェクトを作成する必要があるかどうかを最初に確認するコードと、スレッドオブジェクトを開始するために必要なコードを確認するコードがあることです。競合状態やそれに類するものがあるため、コードの呼び出しが終了する可能性があります。既存のスレッドオブジェクトを開始します。 チェック変数の後ろに詳細を投稿しないと考えると、この動作を引き起こす可能性のあるものを知ることは不可能です。

.Startが新しいオブジェクトに対してのみ呼び出されることが保証されるように、コードを再編成する必要があります。つまり、新しいスレッドオブジェクトを作成するのと同じifステートメントにStartメソッドを配置する必要があります。

個人的には、別のスレッドを作成する必要はなく、ループ内のスレッドオブジェクト内にコードをラップするだけで、スレッドがそのまま続くようにコード全体を再構成しようとします。

1

開始可能状態ではないスレッドを開始しようとしているため、ThreadStateExceptionがスローされます。最も可能性の高い状況は、すでに実行されているか、完全に終了したことです。

起こっている可能性があるいくつかの可能性があります。まず、スレッドがRunningからStopRequestedに移行している可能性があります。これはまだ完全に停止していないため、ロジックが新しいスレッドを作成せず、実行が終了したスレッドや開始しようとしているスレッドを開始しようとしています。実行を終了します(いずれも再起動の有効な状態ではありません)。

もう1つの可能性は、スレッドがアボートしたことです。中止されたスレッドは停止状態ではなく中断状態になりますが、もちろん再開には有効でもありません。

本当に、「再起動可能」なのは、一時停止しているスレッドだけです。あなたは、代わりにこの条件を使用することがあります:

if (this.mThread == null || this.mThread.ThreadState != ThreadState.Suspended)

6

スレッドが同時に複数の状態にあるためにそれが可能だが、そのためThreadStateプロパティは、実際に可能な状態のビットマップです。したがって、1つの州だけと同等のテストを行っても、正しい結果は得られません。

しかし、スレッド状態を確認することは何もしないことです。私はあなたが達成しようとしていることは完全にはっきりしていませんが、スレッドを再起動する前に終了するのを待っていると思います。その場合、あなたが行う必要があります。

mThread.Join(); 
mThread = new Thread(new ParameterizedThreadStart(Monitor)); 
if(check) 
    mThread.Start(60000); 
else 
    mThread.Start(0); 

あなたは、より詳細に解決しようとしている問題、私はほぼ確実だと記述した場合、より良い解決策があるでしょうが、

。スレッドをもう一度再起動するだけでスレッドが終了するのを待つことは、それが効率的ではないようです。多分、スレッド間通信のようなものが必要なのでしょうか?

ジョン。

関連する問題