MongoDB C# 驱动程序 CancellationToken

MongoDB C# driver CancellationToken

有人知道 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

是否回滚?或者它有什么作用?

A CancellationToken 通常在通过 mongodb 驱动程序编写异步 I/O 代码时使用(例如 InsertOneAsync)。让我们考虑以下情况。你正在做早餐。 Example taken from here.

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!");
}

这是很好的异步代码吧?只有当我们需要他们的结果时,我们才会等待我们的任务。

我们首先需要通过 I/O 找到我们的鸡蛋和培根,让我们想象一下我们的鸡蛋和培根存储在 mongodb 中,而不是储藏室。所以我们发送你的 2 个假想 children 和两个 tasks 来从食品储藏室(数据库)中找到鸡蛋和培根。

当他们发现你给自己倒了一杯橙汁和手头上已有的咖啡(基本上任何 CPU 工作)。

手里拿着咖啡和果汁,您意识到自己已准备好准备食材,因此您 await 完成了交给孩子的两项任务 return 以及 FryEggsFryBacon.

美味的早餐已经完成 - 但假设你是一个脾气暴躁的人,早上过得很糟糕,你的咖啡洒了,这让你完全不吃早餐(我知道这很荒谬),你需要告诉你的孩子有任务停止搜索。让我们修改上面的代码以集成它。

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 将在我们的两个查找方法的情况下被调用,并且我们的取消令牌被传入。如果任务尚未完成,它将相应地取消 I/O 操作。