C#异步编程之Async和Await

异步编程

1、Async和Await概念及作用

使用Async和Await进行异步编程,使线程在任务运行时不会阻塞。 尽可能启动任务,不要在等待任务完成时造成阻塞。

阻塞:阻塞每条语句,直到工作完成,然后再继续运行下一条语句。将阻止执行这段代码的线程执行任何其他操作。 在任何任务进行过程中,此代码也不会被中断。 

await 关键字提供了一种非阻塞方式来启动任务,也不会启动任何其他任务,然后在此任务完成时继续执行。使用await时实现在等待任何尚未完成的已启动任务时,处理其线程时将不会被阻塞。不可以await void方法,能await task

 

首先启动每个组件任务,然后再等待之前任务的完成。使用 Task 或 Task<TResult> 对象来保存运行中的任务。 你首先需要 await 每项任务,然后再使用它的结果。 下一步是创建表示其他工作组合的方式。

异步早餐

2、示例介绍之同时启动任务

希望立即启动若干独立的任务。 然后,在每个任务完成时,你可以继续进行已准备的其他工作。 

System.Threading.Tasks.Task 和相关类型是可以用于推断正在进行中的任务的类。

启动一项任务并等待表示运行的 Task 对象。首先 await 每项任务,然后再处理它的结果。

Coffee cup = PourCoffee();
Console.WriteLine("coffee is ready");

//一次启动所有的异步任务。 你仅在需要结果时才会等待每项任务。
Task<Egg> eggsTask = FryEggsAsync(2);
Task<Bacon> baconTask = FryBaconAsync(3);

var toastTask = MakeToastWithButterAndJamAsync(2);
//Task<Toast> toastTask = ToastBreadAsync(2);
//Toast toast = await toastTask;
//同步操作添加黄油与果酱
//ApplyButter(toast);
//ApplyJam(toast);
Console.WriteLine("toast is ready");

Juice oj = PourOJ();
Console.WriteLine("oj is ready");

Egg eggs = await eggsTask;
Console.WriteLine("eggs are ready");
Bacon bacon = await baconTask;
Console.WriteLine("bacon is ready");

Console.WriteLine("Breakfast is ready!");
//工作组合的方式
static async Task<Toast> MakeToastWithButterAndJamAsync(int number)
{
    var toast = await ToastBreadAsync(number);
    ApplyButter(toast);
    ApplyJam(toast);
    return toast;
}

  可以通过使用 Task 类的方法改进上述代码末尾的一系列 await 语句。 其中一个 API 是 WhenAll,它将返回一个其参数列表中的所有任务都已完成时才完成的 Task

await Task.WhenAll(eggsTask, baconTask, toastTask);
Console.WriteLine("eggs are ready");
Console.WriteLine("bacon is ready");
Console.WriteLine("toast is ready");
Console.WriteLine("Breakfast is ready!");

另一种选择是使用 WhenAny,它将返回一个当其参数完成时才完成的 Task<Task>。 你可以等待返回的任务,了解它已经完成了。 以下代码展示了可以如何使用 WhenAny 等待第一个任务完成,然后再处理其结果。 处理已完成任务的结果之后,可以从传递给 WhenAny 的任务列表中删除此已完成的任务。

var breakfastTasks = new List<Task> { eggsTask, baconTask, toastTask };
while (breakfastTasks.Count > 0)
{
    Task finishedTask = await Task.WhenAny(breakfastTasks);
    if (finishedTask == eggsTask)
    {
        Console.WriteLine("eggs are ready");
    }
    else if (finishedTask == baconTask)
    {
        Console.WriteLine("bacon is ready");
    }
    else if (finishedTask == toastTask)
    {
        Console.WriteLine("toast is ready");
    }
    breakfastTasks.Remove(finishedTask);
}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值