0%

async

异步示例:制作早餐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
static async Task Main(string[] args)
{
// 同步倒咖啡
Coffee cup = PourCoffee();
Console.WriteLine("coffee is ready");

// 并发煎蛋、炸薯饼、烤吐司
var eggsTask = FryEggsAsync(2);
var hashBrownTask = FryHashBrownsAsync(3);
var toastTask = MakeToastWithButterAndJamAsync(2);

var breakfastTasks = new List<Task> { eggsTask, hashBrownTask, toastTask };

while (breakfastTasks.Count > 0)
{
// 等待任意一个任务完成
Task finishedTask = await Task.WhenAny(breakfastTasks);

if (finishedTask == eggsTask)
Console.WriteLine("eggs are ready");
else if (finishedTask == hashBrownTask)
Console.WriteLine("hash browns are ready");
else if (finishedTask == toastTask)
Console.WriteLine("toast is ready");

// 可选:处理异常
await finishedTask;

// 从任务列表移除已完成任务
breakfastTasks.Remove(finishedTask);
}

// 同步倒橙汁
Juice oj = PourOJ();
Console.WriteLine("oj is ready");

Console.WriteLine("Breakfast is ready!");
}

🔹 I/O Bound(等待 I/O 的任务)

  • 特点:程序瓶颈在等待外部资源(网络、磁盘等),CPU 大部分时间空闲。

  • 解决方案:使用 await 异步等待,释放线程资源,避免阻塞主线程。

  • await 会做什么

    • 挂起当前方法(如 UI 回调)。
    • 控制权交还给事件循环,不阻塞界面。
    • 等待完成后再恢复执行。

示例

1
var result = await HttpClient.GetAsync("https://api.example.com");

🔸 CPU Bound(计算密集型任务)

  • 特点:瓶颈在本地 CPU 运算,I/O 很少。
  • 解决方案:使用 Task.Run 将计算任务放到线程池,并行执行,减轻主线程压力。

示例

1
var result = await Task.Run(() => CalculateSomethingHeavy());