C# Async Await,简单来说
一次一个
经营邪恶帝国
一下子
有效异步
一次一个
代码的执行是为了实现某个目的。通常,它由一系列步骤组成,最终产生最终结果。每个步骤都需要一些时间,而同步地逐个运行这些步骤可能会耗费大量时间。
假设你是一位邪恶博士——如果你愿意,可以称之为“邪恶博士”。你想经营一家成功的犯罪企业,统治世界;或许你还想赚一百万美元……那么,一个接一个地执行你的所有计划,会是最有效的方法吗?
经营邪恶帝国
作为邪恶的主谋,您首先需要的当然是一个邪恶巢穴。
Task.Delay(x)
给出毫秒的逻辑延迟x
,而不阻塞当前线程
public static void BuildAnEvilLair()
{
await Task.Delay(5000);
Console.WriteLine("Evil Lair Built!");
}
建好巢穴后,您将需要雇佣一些追随者。
public static void HireSomeHenchman()
{
await Task.Delay(2000);
Console.WriteLine("Henchman Hired!");
}
当然,您还需要创建一个您自己的微型克隆。
public static void MakeMiniClone()
{
await Task.Delay(3000);
Console.WriteLine("Mini Clone Created!");
}
一旦所有这一切准备就绪,您就可以开始执行您的超级邪恶计划了!
public static void SuperEvilPlan()
{
await Task.Delay(4000);
Console.WriteLine("Super Evil Plan Completed!");
}
并且我们不要忘记用你的超级邪恶计划威胁世界各国领导人并索要一百万美元的赎金。
public static int MakeOneMillionDollars()
{
await Task.Delay(2000);
Console.WriteLine("Million Dollars Made!");
return 1000000;
}
最后,当一切都完成时,我们就可以实现世界统治。
public static void WorldDomination()
{
await Task.Delay(6000);
Console.WriteLine("World Domination Achieved!");
}
制定计划,
BuildAnEvilLair();
HireSomeHenchman();
MakeMiniClone();
SuperEvilPlan();
var money = MakeOneMillionDollars();
WorldDomination();
同步耗时 22 000 毫秒(或 22 秒)。
一下子
这种同步计划中的许多步骤可以并行、异步地执行。那么如何做到这一点呢?
首先,所有方法都将与async
描述符异步,并且等待它们的执行代码。
等待异步代码,等待的代码会被异步处理,并且后面的代码会作为延续await
添加到。在等待的代码运行完其持续时间并成功执行后,延续将会运行。await
public static async Task BuildAnEvilLair()
{
await Task.Delay(5000);
Console.WriteLine("Evil Lair Built!");
}
public static async Task HireSomeHenchman()
{
await Task.Delay(2000);
Console.WriteLine("Henchman Hired!");
}
public static async Task MakeMiniClone()
{
await Task.Delay(3000);
Console.WriteLine("Mini Clone Created!");
}
public static async Task SuperEvilPlan()
{
await Task.Delay(4000);
Console.WriteLine("Super Evil Plan Completed!");
}
public static async Task<int> MakeOneMillionDollars()
{
await Task.Delay(2000);
Console.WriteLine("Million Dollars Made!");
return 1000000;
}
public static async Task WorldDomination()
{
await Task.Delay(6000);
Console.WriteLine("World Domination Achieved!");
}
带输出
赚了数百万美元!
超级邪恶计划完成!
迷你克隆人诞生!
邪恶巢穴建成!
帮凶已招!
世界霸权已达成!
显然,这很乱。所有操作都同时发生。它真的很快——只依赖于最慢的方法(6000毫秒)。很明显,有些调用依赖于其他调用。现在我们需要将它们彼此同步。
有效异步
那么,作为邪恶主谋,您会执行哪些任务以及按照什么顺序执行?
首先,我们需要一个邪恶的巢穴。之后,我们可以雇佣一些追随者,制造一个我们自己的迷你克隆人。然后,我们可以想出一个超级邪恶计划,最终赚到一百万美元,称霸世界。
await
通过更改执行代码,我们可以通过使用和的正确组合来实现这一点Task.WaitAll
。Task.WaitAll
异步触发所有任务,并在所有任务完成后完成等待这些任务 - 因此花费的时间与它等待的Task.WaitAll
最长任务一样长。
我们再试一次。
// First we need an Evil Lair
await BuildAnEvilLair();
// Next, hire Henchman and create a Clone (asynchronously)
Task.WaitAll(HireSomeHenchman(), MakeMiniClone());
// Now, come up with the evil plan
await SuperEvilPlan();
// And finally, make One Million Dollars (and achieve World Domination)
Task.WaitAll(MakeOneMillionDollars(), WorldDomination());
输出
邪恶巢穴建成!
帮凶已招!
迷你克隆人诞生!
超级邪恶计划完成!
百万美元收入!
世界霸权已达成!
耗时 18,000 毫秒(18 秒)。比同步实现少 4 秒。
所以记住,下次你想成为邪恶天才的时候,考虑一下异步执行,多花点时间。如果一切都取决于那些该死的超级间谍,那就分秒必争!
文章来源:https://dev.to/htissink/c-async-await-simply-5dh1