说说 async await

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/My_ben/article/details/84579134

先附上代码一段,就这段代码抛砖引玉。

public async Task<ActionResult> FifteenYearsActivityShareList(int pageNumber = 1, int rowsPerPage = 20,
   string accountName = null, string phoneNumber = null)
{
    var fifteenYearsActivityShareList = await FifteenYearsService.GetActivityShareStats(
    pageNumber, rowsPerPage,
    accountName, phoneNumber);
    var result = JsonConvert.SerializeObject(fifteenYearsActivityShareList, new JsonSerializerSettings()
    {
           DateFormatString = "yyyy-MM-dd HH:mm",
           ContractResolver = new CamelCasePropertyNamesContractResolver(),
    });
    return Content(result, "application/json");
}

上述是一个简单的查询,以list形式返回给界面。
这是我公司的一位前辈写的代码。在这段代码里我有如下问题:
⑴ async await 是什么?为什么要用它?
⑵ 为什么要用到Task这种构造?
⑶ ContractResolver = new CamelCasePropertyNamesContractResolver()作用是什么?
就这三个问题看了一些博客,做一些浅显的总结。

async await 是什么?为什么要用它?什么时候用它?

说到async await,就不得不说说同步和异步:
同步方法:调用时需要等待返回结果,才可以继续往下执行业务
异步方法:调用时无须等待返回结果,可以继续往下执行业务
开启新线程:在主线程之外开启一个新的线程去执行业务
同步方法和异步方法的本质区别: 调用时是否需要等待返回结果才能继续执行业务
我们比较常见的一些异步方法:
① HttpClient类:PostAsync、PutAsync、GetAsync、DeleteAsync
② EF中DbContext类:SaveChangesAsync
③ 文件相关中的:WriteLineAsync

在这里插入图片描述
为什么要使用异步方法?
道理十分简单,就比如QQ空间里的留言一样,难道一定要等到留言成功才能进行下步操作吗?一般处理是,不管留言是否成功,我们都可以进行别的操作。使用异步,一是提高用户体验的满意度,二是节约时间。
详细demo可参考:深入理解async和await的作用及各种适用场景和用法——引入异步方法的背景
那么,async await 是什么?
⑴ async和await关键字是C# 5.0时引入的,它是一种异步编程模型。
⑵ 它们本身并不创建新线程,但可以在自行封装的async中利用Task.Run开启新线程。
⑶ async中必须要有await运算符才能起到异步方法的作用,且await 运算符只能加在系统类库默认提供的异步方法或者新线程(如:Task.Run)前面。
⑷ async封装的方法中,可以有多个await,这里的await代表等待该行代码执行完毕。
⑸ 我们通常自己封装的方法也要以Async结尾,方便识别。
⑹ 异步返回类型主要有三种:Task <T>、Task、Void。
⑺ 如果async封装的异步方法里既有同步业务又有异步业务(开启新线程或者系统类库提供异步方法),那么同步方法那部分的时间在调用的时候是会阻塞主线程的,即主线程要等待这部分同步业务执行完才能往下执行。
⑻ 如果封装的异步方法中存在等待的问题,而且不能阻塞主线程(不能用Thread.Sleep) , 这个时候可以用Task.Delay,并在前面加await关键字。
什么时候用async await?
async和await是一种异步编程模型,它本身并不能开启新线程,多用于将一些非阻止API或者开启新线程的操作封装起来,使其调用的时候像同步方法一样使用。

为什么要用到Task这种构造?

说Task这种构造,就不得不说异步方法返回类型。 上文已说,异步返回类型主要有三种:Task <T>、Task、Void。
① Task <T>:表示返回值为类型T的操作,处理含有返回值的异步方法,通过 .Result 等待异步方法执行完,且获取到返回值。
② Task:表示一个不返回任何值的操作。
③ void:调用异步执行方法,不需要做任何交互。

ContractResolver = new CamelCasePropertyNamesContractResolver()作用是什么?

Json序列化的一种。使得返回值是驼峰式。返回值的首字母小写。

在这里插入图片描述

参考博文:

深入理解async和await的作用及各种适用场景和用法
用 async/await 来处理异步

猜你喜欢

转载自blog.csdn.net/My_ben/article/details/84579134