初步学习async/await,Task.GetAwaiter,Task.Result
网上关于async/await的知识有很多,看了很多但不如自己实践一遍来得快,所以这里记录下我的理解和大家学习下。
首先以最简单的同步方法来开始如下
private static void Test()
{ Console.WriteLine();
GetV();
Console.WriteLine();
}
private static void GetV()
{
Console.WriteLine();
Console.WriteLine();
Console.WriteLine();
} static void Main(string[] args)
{ Console.WriteLine();
Test();
Console.WriteLine();
}
输出如下
当时当我们简单的使用Task.Run时
private static void Test()
{ Console.WriteLine(2);
GetV();
Console.WriteLine(6);
}
private static void GetV()
{
Console.WriteLine(3);
Task.Run(() =>
{
Thread.Sleep(10000);
Console.WriteLine(4);
});
Console.WriteLine(5);
} static void Main(string[] args)
{ Console.WriteLine(1);
Test();
Console.WriteLine(7);
}
,因为分配了新的线程,所以4会最晚打印出来。
这时候我们使用async/await呢?
private static async Task Test()
{ Console.WriteLine();
await GetV();
Console.WriteLine();
}
private static async Task GetV()
{
Console.WriteLine();
await Task.Run(() =>
{
Thread.Sleep();
Console.WriteLine();
});
Console.WriteLine(); } static void Main(string[] args)
{ Console.WriteLine();
var v= Test();
Console.WriteLine();
}
因为await会时被修饰的代码处于等待状态,就相当于阻塞那段代码,Test方法里面执行到await时就会等待Getv的方法的执行,就会阻塞Test方法,但是不会阻塞Main方法,可以理解为await将阻塞的控制权交给了Test方法。所以这个时候打印结果为
但是当我们把Test的await去掉了,这时候Test方法就没有了阻塞的权限,而是去寻找下一个await来转移控制权,如下
private static void Test()
{ Console.Out.WriteLine();
GetV();
Console.Out.WriteLine();
}
private static async Task GetV()
{
Console.Out.WriteLine();
await Task.Run(() =>
{
Thread.Sleep();
Console.WriteLine();
});
Console.Out.WriteLine(); } static void Main(string[] args)
{ Console.Out.WriteLine();
Test();
Console.Out.WriteLine();
string str = Console.ReadLine();
}
这个时候就不会阻塞Test方法,结果如下
如果在main方法里面使用Task.GetAwaiter或者Task.Result呢,这两个东西我的理解就是阻塞线程,等待异步返回结果,但是它阻塞的是当前的方法,如下代码
private static async Task Test()
{ Console.Out.WriteLine();
GetV();
Console.Out.WriteLine();
}
private static async Task GetV()
{
Console.Out.WriteLine();
await Task.Run(() =>
{
Thread.Sleep();
Console.WriteLine();
});
Console.Out.WriteLine(); } static void Main(string[] args)
{ Console.Out.WriteLine();
Test().GetAwaiter().GetResult() ;
Console.Out.WriteLine();
string str = Console.ReadLine();
}
它只会阻塞main方法的,但是对于Test方法它是无法阻塞的,Test方法仍然会异步执行,4,5仍然以异步的方法打印出来,所以打印结果如下
Task.Result也是如此,只会阻塞当前的方法,我觉得和await相似,只给了当前使用Task.GetAwaiter或者Task.Result的方法阻塞全,没有权利阻塞别的方法。
打个广告:游戏也能赚钱?如果你热爱游戏,并且想通过游戏赢得零花钱,5173是个不错的选择 http://www.5173.com/?recommenduserid=US15061749098191-04F6
初步学习async/await,Task.GetAwaiter,Task.Result的更多相关文章
- JavaScript基础——深入学习async/await
本文由云+社区发表 本篇文章,小编将和大家一起学习异步编程的未来--async/await,它会打破你对上篇文章Promise的认知,竟然异步代码还能这么写! 但是别太得意,你需要深入理解Promis ...
- 七 vue学习 async/await
1: javaScript async/await: 调用async函数的时候,是异步的,函数后面的代码继续执行.! async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解 ...
- async await task.Result 卡死
在如下代码中: public async Task<string> GetData() { return await DoWork(); } 在UI线程中调用 var data = Get ...
- C#多线程和异步(二)——Task和async/await详解
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
- C#多线程和异步(二)——Task和async/await详解(转载)
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
- Task和async/await详解
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
- C#多线程和异步——Task和async/await详解
阅读目录 一.什么是异步 二.Task介绍 1 Task创建和运行 2 Task的阻塞方法(Wait/WaitAll/WaitAny) 3 Task的延续操作(WhenAny/WhenAll/Cont ...
- 浅析C#中的Thread ThreadPool Task和async/await
.net 项目中不可避免地要与线程打交道,目的都是实现异步.并发.从最开始的new Thread()入门,到后来的Task.Run(),如今在使用async/await的时候却有很多疑问. 先来看一段 ...
- .net 异步编程async & await关键字的思考
C# 5.0引入了两个关键字 async和await,这两个关键字在很大程度上帮助我们简化了异步编程的实现代码,而且TPL中的task与async和await有很大的关系 思考了一下异步编程中的asy ...
随机推荐
- SSIS-WMI监视文件夹
在文档交互数据时,通常会排个job每隔几分钟执行来解析文档,但是jOb不能排的太频繁了,所以文档不能及时的被解析. 在SSIS中可以使用WMI这个组件来监视文件夹,一旦有新文档丢入就马上执行解析程序, ...
- 分布式异步框架celery
Celery 1.什么是Clelery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery架构 Celery的架构由三部分组 ...
- java String 常用方法
String方法 class CeShi{ public static void main(String[] args) { //toCharArray char chararraryone[]=&q ...
- 09-C#笔记-循环
1. while 同 C++ 2. for 同 C++ 3. foreach,注意数组的定义 int[] fibarray = new int[] { 0, 1, 1, 2, 3, 5, 8, 13 ...
- 新版Notepad++加十六进制查看的插件HexEditor(转载+总结)
用到hex文件查看,老版本的notepad++是可以安装的,新版本的是安装不了,这个差评啊, 但是网上有方法:https://github.com/chcg/NPP_HexEdit/releases下 ...
- mark-向量式编程
numpy的速度→→→numpy中的向量式编程 from numpy to python https://www.labri.fr/perso/nrougier/from-python-to-nump ...
- [PHP] Laravel使用redis保存SESSION
Laravel使用redis保存SESSION 首先确认服务器已经安装redis服务,php安装了redis扩展. 1.打开config/database.php.在redis配置项中增加sessio ...
- 联想笔记本上Ubuntu无线网卡问题
可能有两个问题: 1.无无线网卡驱动 2.无线网卡驱动不能自动加载 问题1:无线网卡驱动 百度出网卡驱动iwlwifi-9000,如iwlwifi-9000-pu-b0-jf-b0-34.618819 ...
- 【JZOJ100207】【20190705】决心
题目 你需要构造一个排列 初始时\(p_i=i\),一次操作定义为: 选择一些\((x_i,y_i)\),满足每个数字只能出现一次 依次交换\(p_{x_i},p_{y_i}\) 定义一个排列 \(P ...
- haproxy 配置文件详解 之 global
配置示例: global log 127.0.0.1 local0 info maxconn user nobody group nobody daemon nbproc pidfile /usr/l ...