スレッドの一時中断と再開
スレッドの活動を同期する最も一般的な方法は、スレッドをブロックおよび解放するか、またはコード領域またはオブジェクトをロックすることです。 ロックとブロックのしくみの詳細については、「同期プリミティブの概要」を参照してください。
スレッドをスリープ状態にすることもできます。 スレッドがブロックされているかまたはスリープ状態の場合は、ThreadInterruptedException を使用して待機状態を解除できます。
Thread.Sleep メソッド
Thread.Sleep メソッドを呼び出すと、現在のスレッドはすぐに Thread.Sleep に渡した何ミリ秒かの間ブロックされ、残りのタイム スライスは別のスレッドに明け渡されます。 スレッドは、別のスレッドで Thread.Sleep を呼び出すことはできません。
Timeout.Infinite で Thread.Sleep を呼び出すと、スレッドは、Thread.Interrupt を呼び出す別のスレッドによって中断されるまで、または Thread.Abort によって中止されるまで、スリープ状態になります。
スレッドの中断
ブロックされたスレッドで Thread.Interrupt を呼び出すことで、待機中のスレッドを中断し、ThreadInterruptedException をスローさせることができます。これにより、スレッドはブロッキング呼び出しから出されます。 スレッドは、ThreadInterruptedException をキャッチし、操作を継続するために適切な処理を行う必要があります。 スレッドがこの例外を無視した場合は、ランタイムがこの例外をキャッチし、そのスレッドを停止します。
メモ |
---|
Thread.Interrupt が呼び出されたときに対象となるスレッドがブロックされていない場合、スレッドはブロックされるまで中断されません。スレッドがまったくブロックされない場合は、中断されることなく完了されることがあります。 |
待機がマネージ待機である場合は、Thread.Interrupt と Thread.Abort の両方がすぐにスレッドを起動します。 待機がアンマネージ待機の場合 (プラットフォームが Win32 WaitForSingleObject 関数を呼び出した場合など)、Thread.Interrupt と Thread.Abort は、どちらもスレッドがマネージ コードに戻るか、またはマネージ コードを呼び出すまで、そのスレッドを制御できません。 マネージ コードの動作は次のとおりです。
Thread.Interrupt はスレッドをすべての待機から起動し、これによって起動先のスレッドで ThreadInterruptedException がスローされます。
Thread.Abort は、ThreadAbortException をスレッド上でスローする点を除き、Thread.Interrupt に似ています。 詳細については、「スレッドの破棄」を参照してください。
中断と再開 (古い形式)
重要 |
---|
.NET Framework Version 2.0 では、Thread.Suspend メソッドと Thread.Resume メソッドは互換性のために残されており、今後のリリースで削除されます。 |
また、Thread.Suspend を呼び出すと、スレッドを一時中断することもできます。 Thread.Suspend をスレッドに呼び出すと、その呼び出しは、別のスレッドがそのスレッドを再開するまでそのスレッドをブロックします。 スレッドが別のスレッドで Thread.Suspend を呼び出した場合、その呼び出しは非ブロッキング呼び出しであり、この呼び出しによって他のスレッドは一時中断されます。 Thread.Resume を呼び出すと、Thread.Suspend が呼び出された回数に関係なく、別のスレッドが中断状態から出され、実行を再開します。 たとえば、Thread.Suspend を 5 回連続して呼び出した後に Thread.Resume を呼び出すと、スレッドは、Thread.Resume の呼び出しの直後に実行を再開します。
Thread.Sleep とは異なり、Thread.Suspend を呼び出した場合、スレッドはすぐには実行を停止しません。 共通言語ランタイムは、スレッドを中断する前に、そのスレッドがセーフ ポイントに到達するまで待機する必要があります。 スレッドは、起動されていない場合や停止されている場合は、中断できません。 セーフ ポイントの詳細については、「Thread.Suspend、ガベージ コレクション、およびセーフ ポイント」を参照してください。
重要 |
---|
Thread.Suspend メソッドと Thread.Resume メソッドは、一般にアプリケーションには有効ではなく、同期機構と同一の機能を持つと考えることはできません。Thread.Suspend と Thread.Resume は、制御されているスレッドと連携しないため、侵害性が高く、デッドロック (別のスレッドが必要とするリソースを保持するスレッドを中断した場合など) のような深刻なアプリケーション問題の原因となる可能性があります。 |
アプリケーションによっては、パフォーマンスを向上させるために、スレッドの優先順位を制御する必要がある場合があります。 スレッドの優先順位を制御するには、Thread.Suspend ではなく Priority プロパティを使用する必要があります。
参照
参照
概念
Thread.Suspend、ガベージ コレクション、およびセーフ ポイント