zoukankan      html  css  js  c++  java
  • .NET 4.5新关键字async和await:

    .NET 4.5已经发布有段时间了,伴随着而来的是大量的新特性,METRO风格应用程序,MVC4,EF5,等等,其中async/await关键字无疑是其中最亮的部分之一,堪比2.0的泛型,3.0的3W和LINQ,4.0的dynamic。

    因为刚刚开始学习C#4.5新特性,所以理解也不透彻,仅仅是了解用法而已。

    async关键字用来标记在Calling方法上,表示该方法内部将调用一个异步方法,并且该内部异步方法必须使用await进行标记。简单地看代码。

            static void Main(string[] args)
            {
                ShowMessage();
    
                Console.ReadLine();
            }
    
            static void ShowMessage()
            {
                System.Threading.Thread.Sleep(2000);
                Console.WriteLine("Hello World!");
            }

    上面的Show方法,因为方法体执行时间较长(Thread.Sleep(int)),必将阻塞主线程,冻结用户界面。

    那么,用最新的异步编程方法如何避免这样的情况呢?

            static void Main(string[] args)
            {
                ShowMessage();
    
                Console.ReadLine();
            }
    
            static async void ShowMessage()
            {
                await Task.Run(()=>System.Threading.Thread.Sleep(2000));
                Console.WriteLine("Hello World 1!");
            }

    如上,只需要在需要长时间执行的方法体上加上async关键字,然后在内部被调用的实际作业方法上加上await关键字,并使用Task.Run(Action)的方式包装实际作业方法即可。

    那么,实际执行的过程如何呢?

    系统在遇到async关键字时,并不做任何事情,代码继续同步执行,直到真正地遇到await关键字。在遇到await之后,系统利用线程池的线程异步执行被修饰的方法,并在await之后立即返回主线程,主线程继续执行,无需阻塞等待。等到await修饰的异步方法执行完毕后,主线程再切换回await,执行其后剩余的代码。

    简单一句话:我们平常见到的程序大多是线性的,从上而下依次执行代码;而async/await关键字修饰的方法中,依然是线性自上而下执行,遇到await关键字后,跳出async标记的方法,让系统自动去执行async中剩余代码,这样,我们就可以不用关心多线程和来回切换的问题,专注于主要线程。

  • 相关阅读:
    UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design
    UVa 1658 (拆点法 最小费用流) Admiral
    UVa 11082 (网络流建模) Matrix Decompressing
    UVa 753 (二分图最大匹配) A Plug for UNIX
    UVa 1451 (数形结合 单调栈) Average
    UVa 1471 (LIS变形) Defense Lines
    UVa 11572 (滑动窗口) Unique Snowflakes
    UVa 1606 (极角排序) Amphiphilic Carbon Molecules
    UVa 11054 Wine trading in Gergovia
    UVa 140 (枚举排列) Bandwidth
  • 原文地址:https://www.cnblogs.com/kennywangjin/p/2672115.html
Copyright © 2011-2022 走看看