Что такое CancellationTokenSource и CancellationToken
В .NET Core, для выполнения асинхронных операций, широко используется паттерн async/await
. Этот паттерн позволяет легко создавать и управлять асинхронным кодом, не блокируя основной поток приложения. Однако, в некоторых ситуациях может возникнуть необходимость отменить асинхронную операцию, например, когда пользователь прервал выполнение операции или когда асинхронная операция больше не нужна. В этот момент на помощь приходят CancellationTokenSource
и CancellationToken.
CancellationTokenSource и CancellationToken- это взаимосвязанные компоненты в .NET, которые используются для отмены асинхронных операций.
1. CancellationTokenSource:
CancellationTokenSource
представляет источник отмены операции.- Он используется для создания и управления
CancellationToken
. - С помощью
CancellationTokenSource
вы можете инициировать отмену одной или нескольких асинхронных операций. - Когда вы вызываете метод
Cancel()
наCancellationTokenSource
, всеCancellationToken
, связанные с этим источником, будут отменены.
2. CancellationToken:
CancellationToken
представляет токен отмены, который используется для отслеживания запроса на отмену операции.- Он создается на основе
CancellationTokenSource
и передается в асинхронные операции, чтобы они могли проверять, была ли запрошена отмена. - Асинхронные операции, которые принимают
CancellationToken
, должны регулярно проверять, был ли этот токен отменен, и если да, то должны безопасно завершить свою работу. CancellationToken
может быть использован более чем в одной асинхронной операции.
Типичный сценарий использования CancellationTokenSource
и CancellationToken
:
1. Создайте экземпляр CancellationTokenSource
:
- Это позволит вам инициировать отмену одной или нескольких асинхронных операций.
2. Создайте CancellationToken
из CancellationTokenSource
:
- Передайте этот токен в асинхронные операции, которые вы хотите иметь возможность отменять.
3. В асинхронных операциях:
- Регулярно проверяйте, был ли
CancellationToken
отменен. - Если токен отменен, безопасно завершите работу асинхронной операции.
4. Когда вы хотите отменить одну или несколько асинхронных операций:
- Вызовите метод
Cancel()
наCancellationTokenSource
. - Это приведет к отмене всех
CancellationToken
, связанных с этим источником, и позволит асинхронным операциям безопасно завершить свою работу.
Использование CancellationTokenSource
и CancellationToken
помогает обеспечить отзывчивость и управляемость асинхронных операций в вашем приложении. Это особенно важно в сценариях, где необходимо досрочно прекратить длительные асинхронные операции, например, при отмене пользователем операции или при выключении приложения.
Вот простой пример использования токенов отмены для отмены асинхронной операции:
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
static async Task Main(string[] args)
{
using (var cts = new CancellationTokenSource())
{
try
{
await DoLongRunningOperationAsync(cts.Token);
}
catch (OperationCanceledException)
{
Console.WriteLine("Asynchronous operation was canceled.");
}
}
}
static async Task DoLongRunningOperationAsync(CancellationToken cancellationToken)
{
Console.WriteLine("Starting long-running operation...");
// Simulate a long-running operation
await Task.Delay(5000, cancellationToken);
Console.WriteLine("Long-running operation completed.");
}
}
В этом примере, мы создаем CancellationTokenSource
, передаем токен в асинхронный метод DoLongRunningOperationAsync
, и затем отменяем операцию, вызывая cts.Cancel()
. Это приводит к выбрасыванию OperationCanceledException
, которое мы обрабатываем в вызывающем коде. Использование токенов отмены позволяет эффективно управлять жизненным циклом асинхронных операций в .NET Core, обеспечивая гибкость и контроль над ними.
Ссылки на примеры по теме:
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.