ThreadInterruptedException クラス
アセンブリ: mscorlib (mscorlib.dll 内)

<SerializableAttribute> _ <ComVisibleAttribute(True)> _ Public Class ThreadInterruptedException Inherits SystemException
[SerializableAttribute] [ComVisibleAttribute(true)] public class ThreadInterruptedException : SystemException
[SerializableAttribute] [ComVisibleAttribute(true)] public ref class ThreadInterruptedException : public SystemException

スレッドは、作成されてから破棄されるまでの間に、1 回以上 ThreadState 状態になります。スレッドが WaitSleepJoin 状態のときに Interrupt を呼び出すと、ターゲット スレッドで ThreadInterruptedException がスローされます。スレッドが WaitSleepJoin 状態でない場合は、スレッドがその状態になるまで例外はスローされません。スレッドがブロックしない場合、そのスレッドは中断されることなく完了します。
ThreadInterruptedException は、値 0x80131519 の HRESULT COR_E_THREADINTERRUPTED を使用します。
ThreadInterruptedException のインスタンスの初期プロパティ値の一覧については、ThreadInterruptedException コンストラクタのトピックを参照してください。

実行中のスレッドが中断され、その後ブロックされたときの動作の例を次に示します。
Option Explicit Option Strict Imports System Imports System.Security.Permissions Imports System.Threading <Assembly: SecurityPermissionAttribute(SecurityAction.RequestMinimum, _ ControlThread := True)> Public Class ThreadInterrupt <MTAThread> _ Shared Sub Main() Dim stayAwake As New StayAwake() Dim newThread As New Thread(AddressOf stayAwake.ThreadMethod) newThread.Start() ' The following line causes an exception to be thrown ' in ThreadMethod if newThread is currently blocked ' or becomes blocked in the future. newThread.Interrupt() Console.WriteLine("Main thread calls Interrupt on newThread.") ' Tell newThread to go to sleep. stayAwake.SleepSwitch = True ' Wait for newThread to end. newThread.Join() End Sub End Class Public Class StayAwake Dim sleepSwitchValue As Boolean = False WriteOnly Property SleepSwitch As Boolean Set sleepSwitchValue = Value End Set End Property Sub New() End Sub Sub ThreadMethod() Console.WriteLine("newThread is executing ThreadMethod.") While Not sleepSwitchValue ' Use SpinWait instead of Sleep to demonstrate the ' effect of calling Interrupt on a running thread. Thread.SpinWait(10000000) End While Try Console.WriteLine("newThread going to sleep.") ' When newThread goes to sleep, it is immediately ' woken up by a ThreadInterruptedException. Thread.Sleep(Timeout.Infinite) Catch ex As ThreadInterruptedException Console.WriteLine("newThread cannot go to " & _ "sleep - interrupted by main thread.") End Try End Sub End Class
using System; using System.Security.Permissions; using System.Threading; [assembly: SecurityPermissionAttribute(SecurityAction.RequestMinimum, ControlThread = true)] class ThreadInterrupt { static void Main() { StayAwake stayAwake = new StayAwake(); Thread newThread = new Thread(new ThreadStart(stayAwake.ThreadMethod)); newThread.Start(); // The following line causes an exception to be thrown // in ThreadMethod if newThread is currently blocked // or becomes blocked in the future. newThread.Interrupt(); Console.WriteLine("Main thread calls Interrupt on newThread."); // Tell newThread to go to sleep. stayAwake.SleepSwitch = true; // Wait for newThread to end. newThread.Join(); } } class StayAwake { bool sleepSwitch = false; public bool SleepSwitch { set{ sleepSwitch = value; } } public StayAwake(){} public void ThreadMethod() { Console.WriteLine("newThread is executing ThreadMethod."); while(!sleepSwitch) { // Use SpinWait instead of Sleep to demonstrate the // effect of calling Interrupt on a running thread. Thread.SpinWait(10000000); } try { Console.WriteLine("newThread going to sleep."); // When newThread goes to sleep, it is immediately // woken up by a ThreadInterruptedException. Thread.Sleep(Timeout.Infinite); } catch(ThreadInterruptedException e) { Console.WriteLine("newThread cannot go to sleep - " + "interrupted by main thread."); } } }
using namespace System; using namespace System::Security::Permissions; using namespace System::Threading; [assembly:SecurityPermissionAttribute(SecurityAction::RequestMinimum, ControlThread=true)]; ref class StayAwake { private: bool sleepSwitch; public: property bool SleepSwitch { void set( bool value ) { sleepSwitch = value; } } StayAwake() { sleepSwitch = false; } void ThreadMethod() { Console::WriteLine( "newThread is executing ThreadMethod." ); while ( !sleepSwitch ) { // Use SpinWait instead of Sleep to demonstrate the // effect of calling Interrupt on a running thread. Thread::SpinWait( 10000000 ); } try { Console::WriteLine( "newThread going to sleep." ); // When newThread goes to sleep, it is immediately // woken up by a ThreadInterruptedException. Thread::Sleep( Timeout::Infinite ); } catch ( ThreadInterruptedException^ /*e*/ ) { Console::WriteLine( "newThread cannot go to sleep - " "interrupted by main thread." ); } } }; int main() { StayAwake^ stayAwake = gcnew StayAwake; Thread^ newThread = gcnew Thread( gcnew ThreadStart( stayAwake, &StayAwake::ThreadMethod ) ); newThread->Start(); // The following line causes an exception to be thrown // in ThreadMethod if newThread is currently blocked // or becomes blocked in the future. newThread->Interrupt(); Console::WriteLine( "Main thread calls Interrupt on newThread." ); // Then tell newThread to go to sleep. stayAwake->SleepSwitch = true; // Wait for newThread to end. newThread->Join(); }
import System.*; import System.Security.Permissions.*; import System.Threading.*; import System.Threading.Thread; /** @assembly SecurityPermissionAttribute(SecurityAction.RequestMinimum, ControlThread = true) */ class ThreadInterrupt { public static void main(String[] args) { StayAwake stayAwake = new StayAwake(); Thread newThread = new Thread(new ThreadStart(stayAwake.ThreadMethod)); newThread.Start(); // The following line causes an exception to be thrown // in ThreadMethod if newThread is currently blocked // or becomes blocked in the future. newThread.Interrupt(); Console.WriteLine("Main thread calls Interrupt on newThread."); // Tell newThread to go to sleep. stayAwake.set_SleepSwitch(true); // Wait for newThread to end. newThread.Join(); } //main } //ThredInterrupt class StayAwake { private boolean sleepSwitch = false; /** @property */ public void set_SleepSwitch(boolean value) { sleepSwitch = value; } //set_SleepSwitch public StayAwake() { } //StayAwake public void ThreadMethod() { Console.WriteLine("newThread is executing ThreadMethod."); while (!(sleepSwitch)) { // Use SpinWait instead of Sleep to demonstrate the // effect of calling Interrupt on a running thread. Thread.SpinWait(10000000); } try { Console.WriteLine("newThread going to sleep."); // When newThread goes to sleep, it is immediately // woken up by a ThreadInterruptedException. Thread.Sleep(Timeout.Infinite); } catch (ThreadInterruptedException e) { Console.WriteLine(("newThread cannot go to sleep - " + "nterrupted by main thread.")); } } //ThreadMethod } //StayAwake

System.Exception
System.SystemException
System.Threading.ThreadInterruptedException


Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


- ThreadInterruptedException クラスのページへのリンク