c# 并发与异步 四、async和await关键字

本文介绍了C#中async和await关键字的使用方法及原理,通过实例展示了如何利用这两个关键字简化异步编程流程,包括如何创建异步函数、如何处理异步方法的返回值等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、await

        当遇到await表达式时,通常情况下执行过程会返回到调用者上。就像是迭代器中的yield return一样。但是,运行时在返回之前会在等待的任务上附加一个延续,保证任务结束时,执行点会跳回到方法中,并继续执行剩余的代码。如果任务出错,则会重新抛出异常;如果顺利结束,则用返回值为await表达式赋值。

void Main()
{
  DisplayPrimesCount();
}

//添加了async修饰符的方法称为异步函数,这是因为通常它们本身也是异步的。
async void DisplayPrimesCount()
{
  int result = await GetPrimesCountAsync (2, 1000000);
  Console.WriteLine (result);
}

Task<int> GetPrimesCountAsync (int start, int count)
{
  return Task.Run (() =>
    ParallelEnumerable.Range (start, count).Count (n => 
      Enumerable.Range (2, (int)Math.Sqrt(n)-1).All (i => n % i > 0)));
}

二、async

        async修饰符会指示编译器将await作为一个关键字而非标识符来避免二义性(C#5之前的代码有可能将await作为标识符,这样做可以确保之前的代码还能够正确进行编译)。async修饰符只支持返回类型为void以及(我们稍后会介绍的)Task或Task<TResult>的方法(或Lambda表达式)。

        要编写异步函数,可将返回类型由void更改为Task。这样方法本身就可以进行异步调用(并且是可等待的)。

        需要注意的是方法体内并不需要显式返回一个任务。编译器会负责生成任务,并在方法完成之前或出现未处理的异常时触发任务。这样就很容易创建异步调用链。

        异步函数中若方法体返回TResult则函数的返回值为Task<TResult>。

async Task<int> GetAnswerToLife()
{
  await Task.Delay (5000);
  int answer = 21 * 2;
  return answer;
}

三、总结

        1、async和await关键字可以极大地降低程序的复杂性。

        2、使用C#异步函数进行程序设计的基本原则:

        (1)首先以同步方式实现方法。

        (2)其次,将同步方法调用改为异步方法调用,并使用await。

        (3)除了“最顶级”的方法(通常是UI控件事件处理器)之外,将异步方法的返回类型修改为Task或者Task<TResult> ,使其成为可等待的方法。

C# 5.0中,asyncawait关键字是实现异步编程的强大工具,它们允许你在不阻塞主线程的情况下执行长时间运行的任务,从而提升程序的响应性性能。要掌握如何使用这两个关键字进行并发编程,你可以参考《C# 5.0精要:第五版全面指南》这本书。该书详细介绍了asyncawait的用法,以及它们如何帮助开发者写出更加流畅高性能的应用程序。 参考资源链接:[C# 5.0精要:第五版全面指南](https://wenku.youkuaiyun.com/doc/6412b74fbe7fbd1778d49d7f?spm=1055.2569.3001.10343) 使用asyncawait关键字时,你可以将方法标记为async,并在其中使用await来调用异步操作。这种方式不仅代码更加简洁,而且由于不占用主线程资源,用户界面可以保持响应状态。例如,如果你需要从网络下载数据,可以使用HttpClient类的异步方法来实现,而不是使用同步方法导致UI线程被阻塞。 在使用asyncawait关键字时,对性能的提升主要体现在以下几个方面:首先,它允许UI保持响应,用户可以继续应用程序交互;其次,它避免了创建额外的线程,从而降低了资源消耗;最后,通过并发执行多个异步操作,可以更高效地利用CPU资源,提高程序的吞吐量。 为了确保异步编程的正确性性能最大化,本书还详细讲解了任务并行库(TPL)的使用,以及如何通过代码合同来定义检查编程约束,保证代码的质量安全。通过学习这些内容,你可以更好地理解应用asyncawait关键字,进一步优化你的应用程序,为用户带来更加流畅高效的体验。 参考资源链接:[C# 5.0精要:第五版全面指南](https://wenku.youkuaiyun.com/doc/6412b74fbe7fbd1778d49d7f?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坐望云起

如果觉得有用,请不吝打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值