Canceling Threads Cooperatively

Prior to the .NET Framework 4, the .NET Framework provided no built-in way to cancel a thread cooperatively after it was started. However, in .NET Framework 4, you can use cancellation tokens to cancel threads, just as you can use them to cancel System.Threading.Tasks.Task objects or PLINQ queries. Although the System.Threading.Thread class does not offer built-in support for cancellation tokens, you can pass a token to a thread procedure by using the Thread constructor that takes a ParameterizedThreadStart delegate. The following example demonstrates how to do this.


namespace CancelThreads
{
    using System;
    using System.Threading;

    public class ServerClass
    {

        public static void StaticMethod(object obj)
        {
            CancellationToken ct = (CancellationToken)obj;
            Console.WriteLine(
                "ServerClass.StaticMethod is running on another thread.");

            // Simulate work that can be canceled. 
            while (!ct.IsCancellationRequested)
            {
                Thread.SpinWait(50000);
            }
            Console.WriteLine(
                "The worker thread has been canceled. Press any key to exit.");
        }
    }

    public class Simple
    {
        public static void Main(String[] args)
        {
            // The Simple class controls access to the token source.
            CancellationTokenSource cts = new CancellationTokenSource();

            // Allow the UI thread to capture the token source, so that it  
            // can issue the cancel command.
            Thread t1 = new Thread(() =>
            {
                if (Console.ReadKey().KeyChar == 'c')
                    cts.Cancel();
            });

            // ServerClass sees only the token, not the token source.
            Thread t2 = new Thread(new ParameterizedThreadStart(ServerClass.StaticMethod));

            // Start the UI thread.
            t1.Start();

            // Start the worker thread and pass it the token.
            t2.Start(cts.Token);


            Console.ReadKey();
        }
    }
}
Was this page helpful?
(1500 characters remaining)
Thank you for your feedback
Show:
© 2014 Microsoft