C# 编程中异步编程学习记录——使用 Async 和 Await 的异步编程

在最近尝试使用.NET core的过程中,项目开发中前后端基于API是一种趋势,好处就是前后端彻底分离。

基于API开发过程中 异步编程尤为重要。这里我就记录一下自己在学习异步编程中的感悟。

首先这是微软官网中C#的异步编程资料

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/async/index

记住两个关键字  

  1. async:修饰符可将方法、lambda 表达式或匿名方法指定为异步。
  2. await:运算符应用于异步方法中的任务,会让当前方法等待其挂起的方法执行完毕后再继续执行当前方法。
  3. 异步方法需用async关键字描述,且返回类型只能是void、Task、Task ,如果你要执行的异步方法是有返回值的,那么泛型T就定义为你所需返回的类型
  4. await关键字只能在async声明的异步方法中使用,且其挂起的方法返回类型必须是Task<T>或Task.

P:await等待另一个可以执行异步方法返回结果,异步的意思是方法可以同时执行。不会因为某一个需要长时间执行的方法而造成阻塞。

我理解的异步方法:异步和线程相关,异步方法会往下执行,执行到一个时间稍微长一点方法是不会等等返回结果会继续往下执行,这是通过await 等待执行获取返回结果。如微软官方图所示:


有两次返回结果:橙色(把执行权利返回给调用方)和蓝色(方法的返回结果)

  • Task<TResult>(对于返回值的异步方法)。

  • Task(对于执行操作但不返回任何值的异步方法)。

  • void(对于事件处理程序)。

Task和void类似,区别在于 task可以在调用方捕获异常,而void不可以。

通用的异步返回类型和 ValueTask

从 C# 7.0 开始,异步方法可返回任何具有可访问的 GetAwaiter 方法的类型。

Task 和 Task<TResult> 是引用类型,因此,性能关键路径中的内存分配会对性能产生负面影响,尤其当分配出现在紧凑循环中时。 支持通用返回类型意味着可返回轻量值类型(而不是引用类型),从而避免额外的内存分配。

.NET 提供 System.Threading.Tasks.ValueTask<TResult> 结构作为返回任务的通用值的轻量实现。 要使用 System.Threading.Tasks.ValueTask<TResult>类型,必须向项目添加 System.Threading.Tasks.Extensions NuGet 包。


猜你喜欢

转载自blog.csdn.net/w1109390306/article/details/80291564