Summary about Async & Await

新项目组用到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是包含了本行及以下的所有代码在新线程中执行,但仅限本方法及本方法调用的方法,不会进入上级方法。

时间: 2024-08-27 18:02:09

Summary about Async & Await的相关文章

async &amp; await 异步编程的一点巧方法

await 关键字不会创建新的线程,而是由Task任务或是FCL中的xxxAsync等方法创建的线程,而且这里创建的线程都是基于线程池创建的工作线程,属于后台线程. await关键字会阻塞/暂停调用它的方法,也即下面的 Phycology 方法.当阻塞其调用方法的时候,程序会回到UI线程中去执行,也就是main方法中去执行,这点可以通过 C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿! 其内的程序来判断. async & await 组合的程序片段一

[.NET] 利用 async &amp; await 进行异步 IO 操作(整理中...)

利用 async & await 进行异步 IO 操作 可以使用异步函数访问文件.使用异步功能,可以调用异步方法,而不使用回调或拆分您在多个方法或 lambda 表达式中的代码. 若要使同步代码异步,则调用异步方法而不是一个同步方法并添加几个关键字到代码中. 您可能认为添加的以下原因 asynchrony 到文件访问调用: Asynchrony 建议于应用程序的响应能力更强.,因为是一个操作的 UI 线程可以执行其他工作. 如果 UI 线程必须执行需要很长时间的代码(例如,超过 50 毫秒),U

async/await学习笔记

async/await特性 异步方法 包含async修饰符 该修饰符只用于标示这个方法有await表达式 至少包含一个await表达式 返回类型必须为下面这三种 void//尽量别用 Task Task<T> Task类代表这次的异步任务,能从Task中获得任务状态,Task用于表示会返回T类型值的任务 参数不能有out,ref 命名约定:以Async结尾 异步方法的控制流 //调用方法 static void Main(string[] args) { Console.WriteLine(&

[.NET] 使用 async &amp; await 一步步将同步代码转换为异步编程

使用 async & await 一步步将同步代码转换为异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6079707.html  序 上次,博主通过<利用 async & await 的异步编程>一文介绍了 async & await 的基本用法及异步的控制流和一些其它的东西. 今天,博主打算从创建一个普通的 WPF 应用程序开始,看看如何将它逐步转换成一个异步的解决方案.你知道吗?使用 Visual Studi

[C#] 开始接触 async/await 异步编程

开始接触 async/await 异步编程 序 之前已经整理了 4 篇关于 LINQ 的随笔,想换换口味. 目录 What's 异步? async/await 结构 What’s 异步方法? 一.What's 异步? 启动程序时,系统会在内存中创建一个新的进程.进程是构成运行程序资源的集合. 在进程内部,有称为线程的内核对象,它代表的是真正的执行程序.系统会在 Main 方法的第一行语句就开始线程的执行. 线程: (1)默认情况,一个进程只包含一个线程,从程序的开始到执行结束: (2)线程可以派

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

[C#] 走进异步编程的世界 - 开始接触 async/await 走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $"" 来拼接字符串,相当于string.Format() 方法. 目录 What's 异步? async/await 结构 What’s 异步方法? 一.What's 异步? 启动程序时,系统会在内存中创建一个新的进程.进程是构

[.NET] 利用 async &amp; await 的异步编程

利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html  目录 异步编程的简介 异步提高响应能力 更容易编写的异步方法 异步方法的控制流 线程 async 和 await 返回类型和参数信息 命名的约定 一.异步编程的简介 通过使用异步编程,你可以避免性能瓶颈并增强应用程序的总体响应能力. Visual Studio 2012 引入了一个简化的方法,异步编程,在 .NET Framewo

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

原文链接:http://www.cnblogs.com/liqingwen/p/5831951.html 走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $"" 来拼接字符串,相当于string.Format() 方法. 目录 What's 异步? async/await 结构 What’s 异步方法? 一.What's 异步? 启动程序时,系

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

这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $"" 来拼接字符串,相当于string.Format() 方法. 目录 What's 异步? async/await 结构 What's 异步方法? 一.What's 异步? 启动程序时,系统会在内存中创建一个新的进程.进程是构成运行程序资源的集合. 在进程内部,有称为线程的内核对象,它代表的是真正的执行程序.系统会在 Main 方法的第一行语句就开始线程