Middle
Как да отмените изпълнението на задача (task) в C#?
sobes.tech AI
Отговор от AI
За отказ от изпълнение на задача в C# се използва механизъмът CancellationToken и CancellationTokenSource.
- Създава се
CancellationTokenSource. - От
CancellationTokenSourceсе получаваCancellationToken. CancellationTokenсе предава към метода, който изпълнява задачата.- Вътре в изпълнявания метод се проверява периодично свойството
IsCancellationRequestedна токена. - Ако
IsCancellationRequestedе равно наtrue, се генерираOperationCanceledExceptionили се изпълнява друга логика за прекратяване. - За заявка за отказ се извиква методът
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.