A CancellationToken
обычно используется при написании кода асинхронного ввода-вывода через драйвер mongodb (например, InsertOneAsync
). Давайте рассмотрим следующий сценарий. Вы делаете завтрак. Пример взят здесь.
static async Task Main(string[] args)
{
//Find eggs and bacon in database
Task<List<Egg>> eggTask = FindEggsAsync(2);
Task<List<Bacon>> baconTask = FindBaconAsync(3);
Coffee cup = PourCoffee();
Console.WriteLine("coffee is ready");
Juice oj = PourOJ();
Console.WriteLine("oj is ready");
List<Egg> eggs = await eggTask;
List<Bacon> bacon = await baconTask;
FryEggs(eggs);
Console.WriteLine("eggs are ready");
FryBacon(bacon);
Console.WriteLine("bacon is ready");
Console.WriteLine("Breakfast is ready!");
}
Это хороший асинхронный код, верно? Мы ждем наших задач только тогда, когда нам нужен результат от них.
Сначала нам нужно найти яйца и бекон с помощью ввода / вывода, давайте представим, что наши яйца и бекон хранятся в mongodb, а не в кладовой. Итак, мы отправим ваших 2 воображаемых детей с двумя tasks
, чтобы найти яйца и бекон из кладовой (база данных).
Пока они находят, что вы наливаете себе чашку OJ и кофе, который уже был под рукой (в основном, любая работа процессора).
С кофе и соком в руке вы понимаете, что готовы приготовить свои ингредиенты, поэтому вы await
вернете обе задачи, данные вашим детям, и FryEggs
и FryBacon
.
Отличный завтрак готов - но давайте предположим, что вы сварливый человек и у вас было ужасное утро, ваши кофе разлились, и это полностью лишает вас завтрака (абсурдно, я знаю), вы должны сказать своим детям с заданиями прекратить поиски , Давайте изменим приведенный выше код, чтобы интегрировать это.
static async Task Main(string[] args)
{
var cancellationToken = new CancellationTokenSource();
//Find eggs and bacon in database
Task<List<Egg>> eggTask = FindEggsAsync(2,cancellationToken.Token);
Task<List<Bacon>> baconTask = FindBaconAsync(3,cancellationToken.Token);
Coffee cup = PourCoffee();
if(cup.IsSpilled())
{
//Freak out and cancel tasks
cancellationToken.Cancel();
//Quit
Environment.Exit(0)
}
Console.WriteLine("coffee is ready");
Juice oj = PourOJ();
Console.WriteLine("oj is ready");
List<Egg> eggs = await eggTask;
List<Bacon> bacon = await baconTask;
FryEggs(eggs);
Console.WriteLine("eggs are ready");
FryBacon(bacon);
Console.WriteLine("bacon is ready");
Console.WriteLine("Breakfast is ready!");
//Dispose of token
cancellationToken.Dispose();
}
Сам токен отмены будет передан в асинхронную версию метода драйвера mongodb, о которой идет речь. FindAsync
будет вызвано в случае двух наших методов поиска, и будет передан наш токен отмены. Если задача еще не выполнена, она соответственно отменит операцию ввода-вывода.