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
)
是否回滚?或者它有什么作用?
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 以及 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
将在我们的两个查找方法的情况下被调用,并且我们的取消令牌被传入。如果任务尚未完成,它将相应地取消 I/O 操作。
有人知道 CancellationToken 的作用吗,如果您在示例
中添加一个参数public static UpdateResult UpdateMany<TDocument>(
this IMongoCollection<TDocument> collection,
Expression<Func<TDocument, bool>> filter,
UpdateDefinition<TDocument> update,
UpdateOptions options = null,
CancellationToken cancellationToken = null
)
是否回滚?或者它有什么作用?
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 以及 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
将在我们的两个查找方法的情况下被调用,并且我们的取消令牌被传入。如果任务尚未完成,它将相应地取消 I/O 操作。