MongoDB C # драйвер ОтменаТокен - PullRequest
0 голосов
/ 02 мая 2018

Кто-нибудь знает, что делает CancellationToken, если вы добавляете его с параметром, например,

public static UpdateResult UpdateMany<TDocument>(
    this IMongoCollection<TDocument> collection,
    Expression<Func<TDocument, bool>> filter,
    UpdateDefinition<TDocument> update,
    UpdateOptions options = null,
    CancellationToken cancellationToken = null
)

https://mongodb.github.io/mongo-csharp-driver/2.3/apidocs/html/M_MongoDB_Driver_IMongoCollectionExtensions_UpdateMany__1.htm

Это откат? Или что это делает?

1 Ответ

0 голосов
/ 28 мая 2019

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 будет вызвано в случае двух наших методов поиска, и будет передан наш токен отмены. Если задача еще не выполнена, она соответственно отменит операцию ввода-вывода.

...