十年河东,十年河西,莫欺少年穷

学无止境,精益求精

1、简介

从 VS 2012 开始,新引入了一个简化的方法,称为异步编程。我们在 >= .NETFRM 4.5 中和 Windows 运行时中使用异步,编译器它会帮助了我们降低了曾经进行的高难度异步代码编写的工作,但逻辑结构却类似于同步代码。因此,我们仅需要进行一小部分编程的工作就可以获得异步编程的所有优点。

对于同步的代码,大家肯定都不陌生,因为我们平常写的代码大部分都是同步的,然而同步代码却存在一个很严重的问题,例如我们向一个Web服务器发出一个请求时,如果我们发出请求的代码是同步实现的话,这时候我们的应用程序就会处于等待状态,直到收回一个响应信息为止,然而在这个等待的状态,对于用户不能操作任何的UI界面以及也没有任何的消息,如果我们试图去操作界面时,此时我们就会看到”应用程序为响应”的信息(在应用程序的窗口旁),相信大家在平常使用桌面软件或者访问web的时候,肯定都遇到过这样类似的情况的,对于这个,大家肯定会觉得看上去非常不舒服。引起这个原因正是因为代码的实现是同步实现的,所以在没有得到一个响应消息之前,界面就成了一个”卡死”状态了,所以这对于用户来说肯定是不可接受的

2、优势

异步编程最大的优势其实就是提供系统执行效率,毕竟一个串行执行的程序不如并行来的快。譬如:一个人要干十件事情不如十个人各干一件事情效率高。

3、关键字

C# 中的 async 和 await 关键字都是异步编程的核心。通过使用这两个关键字,我们就可以在 .NET 轻松创建异步方法。

4、返回值类型

4.1、Void

如果在触发后,你懒得管,请使用 void。

void返回类型主要用在事件处理程序中,一种称为“fire and forget”(触发并忘记)的活动的方法。除了它之外,我们都应该尽可能是用Task,作为我们异步方法的返回值。

4.2、Task

你如果只是想知道执行的状态,而不需要一个具体的返回结果时,请使用Task。

与void对比呢,Task可以使用await进行等待新线程执行完毕。而void不需要等待。

4.3、Task

当你添加async关键字后,需要返回一个将用于后续操作的对象,请使用Task。

主要有两种方式获取结果值,一个是使用Result属性,一个是使用await。他们的区别在于:如果你使用的是Result,它带有阻塞性,即在任务完成之前进行访问读取它,当前处于活动状态的线程都会出现阻塞的情形,一直到结果值可用。所以,在绝大多数情况下,除非你有绝对的理由告诉自己,否则都应该使用await,而不是属性Result来读取结果值。

5、范例

再进行范例之前,先写一个错误的异步方法,如下:

public static asyncTask SyncExec_3()

{

Proc();

}public static voidProc()

{for (int i = 0; i < 1000; i++)

{

Console.WriteLine(i);

}

}

View Code

由上图截图可以,在异步方法内,需要使用await关键字,否则方法会同步执行。

不是说你把一个方法标记成async这个方法就成了异步调用的方法了。async这个关键词其实反而是可以省略的,这个关键词存在的意义是为了向下兼容,为await提供上下文而已。

如下两个方法其实是一样的

Task DelayAndCalculate1(int a, intb)

{return Task.Delay(1000).ContinueWith(t => a +b);

}async Task DelayAndCalculate2(int a, intb)

{await Task.Delay(1000);return a +b;

}

View Code

那么,既然async是可以省略的,那么await可以省略吗?答案是不可以,否则你的方法会被编译警告,会成为一个同步方法。

其实真正重要的是await,有没有async反而确实不重要。既然微软提供了这样的语法糖,所以建议大家在写异步方法是加上async。

下面我们通过实例来说明异步编程,如下:

5.1、首先验证异步编程是并行至执行的

usingSystem;usingSystem.Diagnostics;usingSystem.Threading.Tasks;namespaceConsoleCore

{classProgram

{static void Main(string[] args)

{

Stopwatch sw= newStopwatch();

sw.Start();

SyncExec();var result =SyncExec_2();

sw.Stop();

TimeSpan ts2=sw.Elapsed;

Console.WriteLine("sw总共花费{0}ms.", ts2.TotalMilliseconds);

Console.Read();

}public static voidProc()

{for (int i = 0; i < 1000; i++)

{

Console.WriteLine(i);

}

}#region 异步方法

public static async voidSyncExec()

{await Task.Run(() =>{

Proc();

});

}public static asyncTask SyncExec_2()

{await Task.Run(() =>{

Proc();

});

}#endregion}

}

View Code

我们在Console.Read();处加上断点,运行如下:

结果:

如上所示,两个计数程序几乎同时执行,且在未执行完毕后,计时程序已经执行完毕了,从而说明异步程序是并行执行的,因此:异步程序可以提高效率。

5.2、返回值为Task的程序具体返回了什么?

public static asyncTask SyncExec_2()

{await Task.Run(() =>{

Proc();

});

}

View Code

通过调试,快速监视,得到如下消息:

其实返回值为Task的方法中什么也没返回,但是我们确定接收到他的返回值,这点似乎是个矛盾点。根据VS快速监视截图,我们发现我们接收的东西是一个上下文线程。

5.3、异步执行的顺序

asp.net html5 异步,asp.net core 系列 5 项目实战之:NetCore 的 async 和 await(参考自:Microsoft教程)...相关推荐

  1. 深度学习入门系列6项目实战:声纳回声识别

    大家好,我技术人Howzit,这是深度学习入门系列第六篇,欢迎大家一起交流! 深度学习入门系列1:多层感知器概述 深度学习入门系列2:用TensorFlow构建你的第一个神经网络 深度学习入门系列3: ...

  2. asp.net html5 缓存,ASP.NET 缓存有效时间设置解决思路

    C# codeusing System; using System.Web.Caching; using System.Web; using System.Collections; using Sys ...

  3. [FPGA系列] SDRAM项目实战总结

    这个项目里面包含了大量的知识点,内容比较复杂,为了方便后续复习,对其中的内容进行一个大概的梳理. 一.项目介绍 设计并实现一个 SDRAM 数据读写控制器,使用 PC 机通过串口向 SDRAM 写入 ...

  4. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-11项目日志解决方案

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

  5. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-10项目各种全局帮助类

    本文目录 1.  前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...

  6. 使用 Async 和 Await 的异步编程

    来自:http://msdn.microsoft.com/library/vstudio/hh191443 异步对可能起阻止作用的活动(例如,应用程序访问 Web 时)至关重要. 对 Web 资源的访 ...

  7. 福布斯系列之数据采集 | Python数据分析项目实战

    1 数据采集概述 开始一个数据分析项目,首先需要做的就是get到原始数据,获得原始数据的方法有多种途径.比如: 获取数据集(dataset)文件 使用爬虫采集数据 直接获得excel.csv及其他数据 ...

  8. asp.net core系列 38 WebAPI 返回类型与响应格式--必备

    一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...

  9. asp.net core 系列 17 通用主机 IHostBuilder

    一.概述 ASP.NET Core 通用主机 (HostBuilder),该主机对于托管不处理 HTTP 请求的应用非常有用.通用主机的目标是将 HTTP 管道从 Web 主机 API 中分离出来,从 ...

最新文章

  1. 基于Keras的CNN/Densenet实现分类
  2. 从新手到入门,如何进入协议分析的世界
  3. zabbix监控管理维护脚本
  4. linux使用遇到的一些小问题
  5. 研发应该懂的binlog知识(下)
  6. 区块链共识算法 PBFT(拜占庭容错)、PAXOS、RAFT简述
  7. centos7搭建jenkins小记
  8. 后来朋友选了伪原创工具下载这个词
  9. C#:winform开发的System.AccessViolationException错误,已解决
  10. (干货)css常用技巧
  11. 正则表达式就这么简单!
  12. Network | parity bit
  13. 无线通信数字调制技术
  14. webservice调用常见错误原因
  15. 绕过微信客户端授权,获取网页源码
  16. CSS解决图片过大撑破DIV的方法
  17. Windows XP SP3版本美化成Vista界面详解
  18. 全“芯”升级,浩辰CAD 2021赋能全国产化CAD应用
  19. python 大智慧接口_大智慧股票本地数据读取接口(含源码)
  20. html星座代码,各星座详细页面.html

热门文章

  1. Python入门100题 | 第028题
  2. 中值滤波scipy.signal.medfilt()方法
  3. 【ssh从零单排】eclipse和tomcat整合配置
  4. 数据库更新记录,但程序查不到新记录问题
  5. spring data redis使用示例
  6. Java编程 的动态性,第 2部分: 引入反射--转载
  7. Xcode执行Analyze静态分析
  8. Lucene的评分(score)机制的简单解释
  9. Introduction to Machine Learning
  10. SpringBoot - 优雅的实现【异步编程】