Thread.Interrupt メソッド
WaitSleepJoin スレッド状態のスレッドを中断します。
Public Sub Interrupt()
[C#]
public void Interrupt();
[C++]
public: void Interrupt();
[JScript]
public function Interrupt();
例外
例外の種類 | 条件 |
---|---|
SecurityException | 呼び出し元に、適切な SecurityPermission がありません。 |
解説
このスレッドは、待機、スリープ、または結合のいずれかの状態で現在ブロックされていない場合は、次にブロックを開始すると中断されます。
使用例
[Visual Basic, C#, C++] 実行中のスレッドが中断され、その後ブロックされたときの動作の例を次に示します。
Option Explicit
Option Strict
Imports System
Imports System.Security.Permissions
Imports System.Threading
<Assembly: SecurityPermissionAttribute(SecurityAction.RequestMinimum, _
ControlThread := True)>
Public Class ThreadInterrupt
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
[C#]
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.");
}
}
}
[C++]
#using <mscorlib.dll>
using namespace System;
using namespace System::Security::Permissions;
using namespace System::Threading;
[assembly: SecurityPermissionAttribute(SecurityAction::RequestMinimum,
ControlThread = true)];
__gc class StayAwake
{
bool sleepSwitch;
public:
__property void set_SleepSwitch(bool value)
{
sleepSwitch = value;
}
StayAwake(){sleepSwitch = false;}
void ThreadMethod()
{
Console::WriteLine(S"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(S"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(S"newThread cannot go to sleep - "
S"interrupted by main thread.");
}
}
};
void main()
{
StayAwake* stayAwake = new StayAwake();
Thread* newThread = new Thread(
new 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(S"Main thread calls Interrupt on newThread.");
// Then tell newThread to go to sleep.
stayAwake->SleepSwitch = true;
// Wait for newThread to end.
newThread->Join();
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
.NET Framework セキュリティ:
参照
Thread クラス | Thread メンバ | System.Threading 名前空間 | ThreadState | スレッドの一時中断と再開 | スレッド状態