Export (0) Print
Expand All

Thread.Interrupt Method

Interrupts a thread that is in the WaitSleepJoin thread state.

[Visual Basic]
Public Sub Interrupt()
[C#]
public void Interrupt();
[C++]
public: void Interrupt();
[JScript]
public function Interrupt();

Exceptions

Exception Type Condition
SecurityException The caller does not have the appropriate SecurityPermission.

Remarks

If this thread is not currently blocked in a wait, sleep, or join state, it will be interrupted when it next begins to block.

Example

[Visual Basic, C#, C++] The following code example shows the behavior of a running thread when it is interrupted and subsequently gets blocked.

[Visual Basic] 
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] No example is available for JScript. To view a Visual Basic, C#, or C++ example, click the Language Filter button Language Filter in the upper-left corner of the page.

Requirements

Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family

.NET Framework Security: 

See Also

Thread Class | Thread Members | System.Threading Namespace | ThreadState | Pausing and Resuming Threads | Thread States

Show:
© 2014 Microsoft