CancellationTokenSource Class

System.Threading

Represents the mechanism by which a CancellationToken is created and signaled.

Description
Members
Examples

Overview

The CancellationTokenSource class is used to create a CancellationToken that can be passed to operations that should be canceled. The CancellationTokenSource then provides a way to signal that cancellation has been requested. This is a fundamental component for cooperative cancellation in asynchronous operations and multithreaded applications.

Key functionalities include:

Thread Safety

Public static members of this type are thread-safe. Any instance members are not guaranteed to be thread-safe.

Remarks

When a CancellationToken is passed to an operation, that operation should periodically check the IsCancellationRequested property of the token. If it becomes true, the operation should clean up its resources and terminate. The operation can also register callbacks to be executed when cancellation is requested.

The Dispose() method should be called when the CancellationTokenSource is no longer needed to release any unmanaged resources.

Cancellation Delay

You can configure a CancellationTokenSource to automatically cancel after a specified time interval using the CancelAfter() method or the constructor overloads that accept a delay.

Cancellation Tasks

You can link multiple CancellationTokenSource instances together. When one source is canceled, it can trigger the cancellation of others.

Public Constructors

Public Properties

Public Methods

Public Static Methods

Protected Methods

Example 1: Basic Cancellation

This example demonstrates how to use CancellationTokenSource to cancel a long-running operation.


using System;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
    public static async Task Main(string[] args)
    {
        // Create a CancellationTokenSource
        var cts = new CancellationTokenSource();
        CancellationToken token = cts.Token;

        Console.WriteLine("Starting a long-running operation...");

        // Start a task that can be cancelled
        var longRunningTask = Task.Run(() =>
        {
            try
            {
                for (int i = 0; i < 10; i++)
                {
                    // Check if cancellation has been requested
                    token.ThrowIfCancellationRequested();

                    Console.WriteLine($"Operation step {i}...");
                    Thread.Sleep(500); // Simulate work
                }
                Console.WriteLine("Long-running operation completed successfully.");
            }
            catch (OperationCanceledException)
            {
                Console.WriteLine("Operation was cancelled.");
            }
        }, token);

        // Wait for a moment, then request cancellation
        await Task.Delay(2000);
        Console.WriteLine("Requesting cancellation...");
        cts.Cancel();

        // Wait for the task to complete (either by finishing or being cancelled)
        await longRunningTask;

        // Clean up the CancellationTokenSource
        cts.Dispose();

        Console.WriteLine("Program finished.");
    }
}

Example 2: Cancellation with Delay

This example shows how to use CancelAfter to automatically cancel an operation after a specified time.


using System;
using System.Threading;
using System.Threading.Tasks;

public class ExampleWithDelay
{
    public static async Task Main(string[] args)
    {
        // Create a CancellationTokenSource that will cancel after 3 seconds
        var cts = new CancellationTokenSource();

        Console.WriteLine("Starting an operation that will be auto-cancelled in 3 seconds...");

        var operation = Task.Run(async () =>
        {
            try
            {
                cts.CancelAfter(3000); // Cancel after 3000 milliseconds
                for (int i = 0; i < 10; i++)
                {
                    if (cts.Token.IsCancellationRequested)
                    {
                        Console.WriteLine("Cancellation detected within loop.");
                        break;
                    }
                    Console.WriteLine($"Working... {i}");
                    await Task.Delay(1000, cts.Token); // Important: pass token to delay too
                }
                Console.WriteLine("Operation finished before auto-cancellation.");
            }
            catch (OperationCanceledException)
            {
                Console.WriteLine("Operation was cancelled by timer.");
            }
        });

        await operation;
        cts.Dispose();
        Console.WriteLine("Program finished.");
    }
}