Sobes.tech
Middle

Как да отмените изпълнението на задача (task) в C#?

sobes.tech AI

Отговор от AI

За отказ от изпълнение на задача в C# се използва механизъмът CancellationToken и CancellationTokenSource.

  1. Създава се CancellationTokenSource.
  2. От CancellationTokenSource се получава CancellationToken.
  3. CancellationToken се предава към метода, който изпълнява задачата.
  4. Вътре в изпълнявания метод се проверява периодично свойството IsCancellationRequested на токена.
  5. Ако IsCancellationRequested е равно на true, се генерира OperationCanceledException или се изпълнява друга логика за прекратяване.
  6. За заявка за отказ се извиква методът Cancel() на обекта CancellationTokenSource.

Пример за използване:

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

// Създаване на източник на токени за отказ
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

// Създаване на задача
Task task = Task.Run(() =>
{
    try
    {
        for (int i = 0; i < 100; i++)
        {
            // Проверка дали е поискана отмяна
            if (token.IsCancellationRequested)
            {
                // Генериране на изключение OperationCanceledException
                token.ThrowIfCancellationRequested();
            }

            // Имитиране на работа
            Console.WriteLine($"Работя... {i}");
            Thread.Sleep(100);
        }
    }
    catch (OperationCanceledException)
    {
        // Обработка на изключението за отказ
        Console.WriteLine("Задачата е отменена.");
    }
    catch (Exception ex)
    {
        // Обработка на други изключения
        Console.WriteLine($"Възникна грешка: {ex.Message}");
    }
}, token); // Предаване на токена към задачата

// Изчакване известно време, след което се иска отказ
Thread.Sleep(500);
Console.WriteLine("Заявка за отказ...");
cts.Cancel();

// Изчакване завършването на задачата
try
{
    task.Wait();
}
catch (AggregateException ae)
{
    // Обработка на изключения, включително OperationCanceledException
    foreach (var e in ae.InnerExceptions)
    {
        if (e is OperationCanceledException)
        {
            Console.WriteLine("Завършена отменена задача (чрез Wait).");
        }
        else
        {
            // Обработка на други изключения
            Console.WriteLine($"Грешка при завършване на задачата: {e.Message}");
        }
    }
}

Console.WriteLine("Основната програма е завършена.");

Алтернативи:

  • Връщане на специална стойност или флаг от задачата.
  • Проверка на флаг, зададен отвън, без използване на CancellationToken.

Въпреки това, CancellationToken е стандартният и препоръчителен подход поради интеграцията си с Task Parallel Library (TPL), асинхронните операции и поддръжката на OperationCanceledException.