使用 Async 和 Await 的异步编程(C#)

本篇的内容大部分来自于同事的邮件描述,本想自己用言简意赅的用语言转述,无奈语言水平有限,且同事的介绍也是极尽详细和明了,故不再画蛇添足,直接引述....

通过使用异步编程,你可以避免性能瓶颈并增强应用程序的总体响应能力。但是,编写异步应用程序的传统技术可能比较复杂,使它们难以编写、调试和维护。

Visual Studio 2012 引入了一个简化的方法,异步编程,在 .NET Framework 4.5 和 Windows 运行时利用异步支持。 编译器可执行开发人员曾进行的高难度工作,且应用程序保留了一个类似于同步代码的逻辑结构。因此,你只需做一小部分工作就可以获得异步编程的所有好处。

拿我现在做的项目来说,主要是写WebAPI,其中一些接口中返回值的处理尤其复杂,如:需要在几个数据源中拿数据,然后可能还要根据业务进行大数据的处理和分析等等,执行效率就变得没那么快了,且这些操作都是同步完成的,包括一些占用资源的操作,如果有多个WebApi请求并发时,IIS处理请求的线程池就会被这个消耗资源的操作(比如访问数据库、或者请求别的服务)所占,在操作完成前线程不释放,IIS线程池可用性降低。

然后个人又特懒,并不想写那些传统的异步实现方式,无意间看到同事的推荐,甚为惊讶,这尼玛异步实现得也太简单了吧,于是忍不住想向各位分享一番!!

示例如下:

1.原代码,同步处理

[HttpGet]

public HotelListResponse List(…

{

//方法内部有不少数据获取和处理的操作,暂不一一贴出

result = HotelBusiness.Instance.QueryHotelList(parameter);  // 阻塞IIS线程

return result;

}

2.只加了几个关键字,就变成了异步处理方式

[HttpGet]

public async Task<HotelListResponse> List(…

{

    …

    return await Task.Factory.StartNew(() => HotelBusiness.Instance.QueryHotelList(parameter)); // 资源消耗的操作,移到了异步上

}

3.修改之后的代码运行时,有请求进来时当前的IIS线程ID是9

4.消耗资源的操作,是在另外一个线程上运行,并没有占用IIS处理该请求的线程

关于使用 Async 和 Await 的异步编程

这里主要是使用了async和await的关键字,是.net 4.5新特性,请参考

Asynchronous Programming with Async and Await (C# and Visual Basic)

                   URL: https://msdn.microsoft.com/en-us/library/hh191443.aspx

                   URL: https://msdn.microsoft.com/zh-cn/library/hh191443.aspx  (中文翻译版)

我也是才开通的博客,亦是第一次写博客,如有不足之处,欢迎各位大神批评指正,如有不同见地,不妨在下方写一下,不胜感谢!

原文地址:https://www.cnblogs.com/ramluo/p/5013872.html