Skip to main content

You cannot directly interrupt a Task in .NET while it's running. You can do it indirectly through the CancellationTokenSource object. This object has a CancellationToken property which must be passed into the constructor of the Task:

//
// You cannot directly interrupt a Task in .NET while it's running. You can do it
// indirectly through the CancellationTokenSource object. This object has a
// CancellationToken property which must be passed into the constructor of the Task:
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
CancellationToken cancellationToken = cancellationTokenSource.Token;

//
// The cancellation token can be used as follows... create the task:
Task task = Task.Factory.StartNew(() =>
{
    // We simply count up to 100000 in the Task body. Note the
    // IsCancellationRequested property of the token. We monitor within the loop
    // whether the task has been cancelled.
    for (int i = 0; i < 100000; i++)
    {
        if (cancellationToken.IsCancellationRequested)
        {
            Console.WriteLine("Task cancelled, must throw exception.");
            throw new OperationCanceledException(cancellationToken);
        }
        else
        {
            Console.WriteLine(i);
        }
    }
}, cancellationToken);

//
// You can register a delegate on the token that should be called when the task is cancelled:
cancellationToken.Register(() =>
{
    DoSomethingUponTaskCancellation();
});

//
// You can clean up resources, cancel other tasks that rely on this particular
// task, notify the user, log the cancellation etc., it's up to you how you
// implement the delegate. The Register method accepts an Action object or an
// Action of T which allows you to provide a state parameter.
//
// You can cancel the task by calling the Cancel() method of the token like this:
cancellationTokenSource.Cancel();

//
// Note that this method only signals the wish to cancel a task. .NET will not
// actively interrupt the task, you'll have to monitor the status through the
// IsCancellationRequested property. It is your responsibility to stop the task.
// In this example we throw an OperationCanceledException which is a must in
// order to correctly acknowledge the cancellation. If you forget this step then
// the task status will not be set correctly. Once the task has been requested
// the stop it cannot be restarted.
//
// If that's all you want to do, i.e. throw an OperationCanceledException, then
// there's a shorter version:
cancellationToken.ThrowIfCancellationRequested();

//
// This will perform the cancellation check and throw the exception in one step.
// The loop can thus be simplified as follows:
Task task = Task.Factory.StartNew(() =>
{
    for (int i = 0; i < 100000; i++)
    {
        // shorthand
        cancellationToken.ThrowIfCancellationRequested();

        Console.WriteLine(i);
    }
}, cancellationToken);