新项目组用到Async & Await, 关于Await会不会新开不开线程,遇到什么情况会新开线程的问题网上查了很多资料都没看到直观的解释。现简单总结一下。

直接上代码:

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Test(); Console.WriteLine("Current Thread Id1 :{0}", Thread.CurrentThread.ManagedThreadId);
Console.ReadKey();
} static async Task Test()
{ await Task.Run(new Action(GetName)); //Await 在这里必须搭配Task的新开线程方法使用,并且表示从这一行开始的剩余code在新线程中执行,并告诉Main线程继续往下执行。
Console.WriteLine("Current Thread Id2 :{0}", Thread.CurrentThread.ManagedThreadId); } public static void GetName()
{
for(int i=0; i<1000000000;i++)
{
int a = 15*15*15*15*15*15;
} Console.WriteLine("Current Thread Id3 :{0}", Thread.CurrentThread.ManagedThreadId);
} }
}

  

结果如下

Current Thread Id1 :9  

Current Thread Id3 :10

Current Thread Id2 :10

为了验证await是不是遇到新开启线程的方法才会触发他的作用,做如下更改。

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Test(); Console.WriteLine("Current Thread Id1 :{0}", Thread.CurrentThread.ManagedThreadId);
Console.ReadKey();
} static async Task Test()
{ await GetName();
Console.WriteLine("Current Thread Id2 :{0}", Thread.CurrentThread.ManagedThreadId); } public static async Task GetName()
{
for(int i=0; i<1000000000;i++)
{
int a = 15*15*15*15*15*15;
} await Task.Delay(10000);
Console.WriteLine("Current Thread Id3 :{0}", Thread.CurrentThread.ManagedThreadId);
} }
}

  

发现Main线程会等待GetName里的复杂运算结束后,知道Task.Delay才会继续执行Main线程,猜测正确。

补充一句,在第一段code中,如果在Test方法中的 await Task.Run(new Action(GetName));  没有await, 代码跑到这里开启线程的同时Main线程会继续往下之前,因此await是包含了本行及以下的所有代码在新线程中执行,但仅限本方法及本方法调用的方法,不会进入上级方法。

小结: Async & Await的更多相关文章

  1. 浅谈Async/Await

    概要 在很长一段时间里面,FE们不得不依靠回调来处理异步代码.使用回调的结果是,代码变得很纠结,不便于理解与维护,值得庆幸的是Promise带来了.then(),让代码变得井然有序,便于管理.于是我们 ...

  2. [C#] 走进异步编程的世界 - 开始接触 async/await

    走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $&qu ...

  3. 走进异步编程的世界 - 开始接触 async/await

    [C#] 走进异步编程的世界 - 开始接触 async/await   走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async ...

  4. [C#] 走进异步编程的世界 - 开始接触 async/await(转)

    原文链接:http://www.cnblogs.com/liqingwen/p/5831951.html 走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 ...

  5. 走进异步编程的世界 - 开始接触 async/await(转)

    序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $"" 来拼接字符串,相当于string.Fo ...

  6. C#多线程和异步(二)——Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  7. [翻译] Python 3.5中async/await的工作机制

    Python 3.5中async/await的工作机制 多处翻译出于自己理解,如有疑惑请参考原文 原文链接 身为Python核心开发组的成员,我对于这门语言的各种细节充满好奇.尽管我很清楚自己不可能对 ...

  8. C#多线程和异步(二)——Task和async/await详解(转载)

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  9. Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

随机推荐

  1. DataGrid( 数据表格) 组件[5]

    本节课重点了解 EasyUI 中 DataGrid(数据表格)组件的使用方法,这个组件依赖于Panel(面板).Resizeable(调整大小).LinkButton(按钮).Pageination( ...

  2. django: db - admin

    本讲演示简单使用 Django Admin 功能. 一,修改 settings.py,添加 admin 应用: INSTALLED_APPS = ( 'django.contrib.auth', 'd ...

  3. 在div+css中用到的js代码注意return

    今天做了一个项目,美工做好后放在了form中(没有加runat=server),由于用到了服务器控件,所以这里要加,否则报错,关键一段div代码是: <form id="form_re ...

  4. 高仿QQ即时聊天软件开发系列之二登录窗口界面

    继上一篇高仿QQ即时聊天软件开发系列之一开端之后,开始做登录窗口 废话不多说,先看效果,只有界面 可能还有一些细节地方没有做,例如那个LOGO嘛,不要在意这些细节 GIF虽短,可是这做起来真难,好吧因 ...

  5. CODEVS 1287 矩阵乘法

    1287 矩阵乘法  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊) ...

  6. [Leetcode][020] Valid Parentheses (Java)

    题目在这里: https://leetcode.com/problems/valid-parentheses/ [标签]Stack; String [个人分析]这个题应该算是Stack的经典应用.先进 ...

  7. zip命令的用法

    语法zip [参数] [打包后的文件名] [打包的目录路径] 参数列表-a 将文件转成ASCII模式-F 尝试修复损坏的压缩文件-h 显示帮助界面-m 将文件压缩之后,删除源文件-n 特定字符串,不压 ...

  8. CentOS 5设置服务器hostname、DNS和IP

    CentOS 5如何设置服务器主机名.DNS?设置主机名hostname编辑/etc/hostname文件写入:116.23.14.25 centostest.com其中116.23.14.25 表示 ...

  9. 解决ie6显示透明图的问题

    在我们设置png透明图片时,其他浏览器都显示很正常,唯独只有ie6看着不是透明的状态. 第一种办法是:单独设置ie6的样式.例: _background: none; _filter:progid:D ...

  10. android:showAsAction="never"是做什么用的?

    安卓开发项目文件中有一个目录叫做menu,里面有tybmain.xmlitem选项里有一句 android:showAsAction = "never"那么这句话是做什么用的呢?原 ...