在C# 中,可以使用asyc+await来完成一个异步方法

async用来标志一个使用了await的方法是非阻塞API,是一个异步方法,就当成一个普通关键字就行了。关键是await,await是配合 Task、Task<TResult>或者非阻塞API使用的。它也是多线程操作。await表示等待task的操作,阻塞了这个方法,这个异步方法的内部是线性的,是从上之下的,等执行到await停下来,返回方法的调用方,同时执行调用方接下来的代码和异步方法中的代码。对于异步方法本身来说,方法内部是线性的,但是对于调用异步方法的主体来说,是并行的。

1、task和async的区别

场景不同。task用于多线程编程,主要用于与当前线程无关的操作,比如我开一个线程去把队列里面的日志写到本地文件,这个队列可能很长,我直接开一个线程去写就行了,反正我又不用这个写日志这个行为返回什么值;至于async标识一个异步方法,我需要用到这个异步方法的返回值Task<TResult>,但是这个方法中可能执行时间有点长,你先不用等我了去干其它的,你干其它的的同时我计算这个值,我们并行操作,等你用到这个值的时候我没执行完你就接着等,我完成了你就直接用。我们一起工作,肯定不亏。

2、async代码

 /*
========================================================================
演示功能:
1.async方法内部是线性执行的
2.调用async方法的主体和async方法是并行执行的
3.在使用async返回值时,若async返回了值直接使用,还没有完成就等待完成
总结:
async中代码是顺序执行的,只是执行到await会说我这个操作可能要很长时间,如果你急着用那你就等我完成,如果你不急着用你就先干别的,
你正在干别的时候如果我完成了你想用的时候就直接用,如果你完成了我还没完成那你就接着等我完成。
反正我们是并行的,肯定不亏。
========================================================================
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace AsyncDemo
{
class Program
{
public static int a = ;
static void Main(string[] args)
{
var result = Add();
// 等待3秒输出,说明是在使用值得时候进行等待
// 输出6,说明async是线性执行的
Console.WriteLine(result.Result);
var result2 = Add();
// 再次等待3秒
Thread.Sleep();
Console.WriteLine();
Console.WriteLine(result2.Result);
// 同时输出1和6,说明是并行执行的,Add开始沉睡3秒的时候主线程同时沉睡3秒,然后主线程醒了同时result2被赋予了值
Console.Read();
}
public static async Task<int> Add()
{
await Task.Run(() =>
{
Thread.Sleep();
a += ;
});
a = ;
return a;
}
}
}

项目工程地址:https://github.com/Beiluola/AsyncDemo

最新文章

  1. 基于Ruby的watir-webdriver自动化测试方案与实施(四)
  2. [BZOJ2391]Cirno的忧郁
  3. Android 二维码 生成和识别(附Demo源码)
  4. win10 1607 密匙
  5. Windows无法启动MySQL服务,错误 1053
  6. Leetcode 232 Implement Queue using Stacks STL
  7. WPA-PSK无线网络破解原理及过程(转)
  8. C语言的一点操作(学习笔记)
  9. POJ 2182
  10. TypeScript学习指南第一章--基础数据类型(Basic Types)
  11. CentOS下MySQL 5.7编译安装
  12. KMP算法的实现
  13. 警惕!MySQL成数据勒索新目标
  14. 深入理解循环队列----循环数组实现ArrayDeque
  15. MTBF
  16. noip2017&quot;退役&quot;记
  17. JQuery:怎么动态切换一个元素的显示、隐藏呢?原来隐藏就显示,原来显示就隐藏
  18. mongodb管理与安全认证
  19. 生成32位UUID及生成指定个数的UUID
  20. Delphi 的多线程使用已经很简单了

热门文章

  1. Python的设计哲学
  2. RESTful API终极版序列化封装
  3. ggplot2 texts : Add text annotations to a graph in R software
  4. 小学生作业V2.0
  5. js中获取父节点,兄弟节点及处理属性节点
  6. jsp脚本语法
  7. 面试概率极大的Oracle存储过程
  8. ajax传递数组及后台接收
  9. 未能映射路径&quot;/&quot;
  10. SQLite介绍