async,await与task.wait()或task.Result的区别
你是否曾经与我一样不理解async,await与task.wait()或者task.Result的区别?
接下来,一个Demo让你看出他们之间的区别。
static void Main(string[] args)
{
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:start"); Test(); //不等待
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:end");
Console.Read();
} static Task<int> Sleep()
{
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Sleep start");
Thread.Sleep();
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Sleep end");
return Task.FromResult();
} static Task<int> Test()
{
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Test start");
var a=Task.Run(Sleep).Result;//由上一篇文章可知Run将会在线程池内调度执行
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Test end");
return Task.FromResult(a);
}
运行结果:
1:start
1:Test start
4:Sleep start
4:Sleep end
1:Test end
1:end
由此可以看出Task.Result会阻塞主线程。
static void Main(string[] args)
{
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:start"); TestAsync();//不等待 Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:end");
Console.Read();
} static Task<int> Sleep()
{
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Sleep start");
Thread.Sleep();
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Sleep end");
return Task.FromResult();
} static async Task<int> TestAsync()
{
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Test start");
var a = await Task.Run(Sleep);
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Test end");
return a;
}
运行结果:
1:start
1:Test start
4:Sleep start
1:end
4:Sleep end
4:Test end
async,await不会阻塞主线程
async,await与task.wait()或task.Result的区别的更多相关文章
- 关于异步执行(Async/await)的理解(转发)
原文地址: http://blog.jobbole.com/85787/ 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异 ...
- async/await 异步编程(转载)
转载地址:http://www.cnblogs.com/teroy/p/4015461.html 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入 ...
- C#中async/await中的异常处理
在同步编程中,一旦出现错误就会抛出异常,我们可以使用try-catch来捕捉异常,而未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制.不过对于异步编程来说,异常处理一直是件麻烦的事情, ...
- async/await 异步编程
前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关的知识,并整理成这篇博客,如果在 ...
- 关于C#中async/await中的异常处理(上)-(转载)
在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕捉异常,而未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制.不过对于异步编程来说,异常处理一直是件麻烦的事情, ...
- .NET 中的 async/await 异步编程
原文出处: Teroy 的博客 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关 ...
- C# Async&Await
在async和await之前我们用Task来实现异步任务是这样做的: static Task<string> GetBaiduHtmlTAP() { //创建一个异步Task对象,内部封装 ...
- 关于C#中async/await中的异常处理(上)
关于C#中async/await中的异常处理(上) 2012-04-11 09:15 by 老赵, 17919 visits 在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕 ...
- [转] 理解 JavaScript 的 async/await
[From] https://segmentfault.com/a/1190000007535316 边城 2016年11月19日发布 随着 Node 7 的发布,越来越多的人开始研究据说是 ...
- 理解 JavaScript 的 async/await
随着 Node 7 的发布,越来越多的人开始研究据说是异步编程终级解决方案的 async/await.我第一次看到这组关键字并不是在 JavaScript 语言里,而是在 c# 5.0 的语法中.C# ...
随机推荐
- String是否相等、new的时候创建了几个对象等问题详解
问题一 这段代码创建了几个对象? String str1 = new String("aa"); 答案是两个 "aa"对象和String对象 Java代码在编译 ...
- java程序:转化金额
在处理财务账款时,需要将转账金额写成大写的.也就是说,如果要转账123456.00元,则需要写成“壹拾贰万叁仟肆佰伍拾陆元整”.所以常常需要通过程序控制自动进行转换.本实例实现了小写金额到大写金额的转 ...
- flink 一分钟入门篇
1. 业务说:“…… bulabula……,这个需求很简单,怎么实现我不管?” 面对霸气侧漏的业务需求,由于没有大数据知识储备,咱心里没底,咱也不敢问,咱也不敢说,只能静下来默默储备.默默寻觅解决方案 ...
- 关于C#三层架构增删改查中的“修改”问题
先来一个界面图: DAO中的方法: 这里需要获得数据的ID,进而进行操作. 之后是代码的实现: 修改的功能中需要注意的是:根据项目具体需要来判断修改的内容. 希望对您有所帮助!
- Centos装机预备技能
装机预备技能 1.1问题 本例要求安装一台可用的KVM服务器: RHEL与Cent ...
- MTK Android 源码目录分析
Android 源码目录分析 Android 4.0 |-- abi (application binary interface:应用二进制接口)|-- art (average retrieval ...
- redis持久化文件问题
问题: Can't open the append-only file Permission denied 发现缺少文件:/data/缺少appendonly.aof,dump.rdb文件. 手动创建 ...
- PAT 链表倒序的算法优化
之前的答案错误问题已经解决了,现在还有运行超时的问题,先贴上之前的代码 1 #include <iostream> 2 #include <string.h> 3 using ...
- Python库-Matplotlib
Matplotlib官网https://matplotlib.org,Matplotlib是一个Python的2D绘图库. 可视化是整个数据分析的关键辅助工具,可以清晰的理解数据. 折线图(用于显示数 ...
- MySQL学习之路5-数据表的常用操作
排序 :order by desc select * from <tablename> order by <字段名> desc:order by默认升序 desc 降序 分组 ...