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中剩余代码,这样,我们就可以不用关心多线程和来回切换的问题,专注于主要线程。

  • 相关阅读:
    关于GridView Master-Detail 不支持明细属性为IEnumerable、IList问题
    GridControl摘录
    DevExpress中chartControl中实现统计图功能
    DevExpress中GridControl列转义的实现方法
    DevExpress实现根据行,列索引来获取RepositoryItem的方法
    修改yum源为阿里云的
    使用sendmail来发邮件
    nginx默认访问目录时显示403错误
    同时调整lv分区的大小(减少一个,增加另一个)
    ORA-00257错误的解决办法
  • 原文地址:https://www.cnblogs.com/kennywangjin/p/2672115.html
Copyright © 2011-2022 走看看