新项目组用到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. ADO.NET之使用DataGridView控件显示从服务器上获取的数据

    今天回顾下ADO.NET中关于使用DataGridiew控件显示数据的相关知识 理论整理: 使用 DataGridView 控件,可以显示和编辑来自多种不同类型的数据源的表格数据. SqlDataAd ...

  2. Sql Server 2008清理数据库日志的语句

    USE [master]GOALTER DATABASE DNName SET RECOVERY SIMPLE WITH NO_WAITGOALTER DATABASE DNName SET RECO ...

  3. Swift中扩展的使用

    import Foundation /* 扩展 1.使用扩展添加属性, 方法, 可变方法, 构造器, 下标, 嵌套类型 2.可以使一个已有类型符合一个或者多个协议 3.扩展与OC的Category类似 ...

  4. angularjs中ng-switch的用法

    <!DOCTYPE html> <html lang="zh-CN" ng-app="app" ng-controller="ctr ...

  5. 读书笔记_Effective_C++_条款二十二:将成员变量声明为private

    1.格式统一 在调用的时候,不会去想有没有(),一律是有get(),或者set()之类的. 2.封装 能直接访问得越少,表明封装性越高, 封装性越高,我们的顾虑就少了, 例如:我们a.data*0.9 ...

  6. C++ Primer 5th 第5章 语句

    和大多数语言一样,C++提供了条件执行语句.重复执行相同代码的循环语句和由于中断当前控制流的跳转语句,表达式语句和声明语句等. 语句有简单语句和复合语句之分.简单语句但多数以分号结束,最简单的语句就是 ...

  7. OOAD基本概念

    学习目标: 1.理解与掌握面向对象的概念与方法. 2.使用UML. 3.完成面向对象的分析与设计工作. 4.了解OO的设计原则及一些典型的设计模式 什么是面向对象? 面向对象(Object-Orien ...

  8. python学习第十四天 -面向对象编程基础

    python也是支持面向对象编程的.这一章节主要讲一些python面向对象编程的一些基础. 什么是面向对象的编程? 1.面向对象编程是一种程序设计范式 2.把程序看做不同对象的相互调用 3.对现实世界 ...

  9. win7下的iis配置

    1.配置错误 说明:在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息:无法识别的属性“targetFramework”.请注意属性名称区分 ...

  10. Lazy Load Plugin for jQuery延迟加载测试成功

    一直需要的功能,网页图片太多时对于降低网络流量超有用. 最新的V1.9.3版本其实已不用修改就可以起作用了. 不用网上说的要自己修改代码.