码迷,mamicode.com
首页 > Web开发 > 详细

.net4.5的异步 async await 和Task

时间:2015-10-01 21:40:23      阅读:286      评论:0      收藏:0      [点我收藏+]

标签:

首先应该明白Task的概念-----任务 //这是一种优于Thread,甚至是ThreadPool的东西 而且是默认异步

再来理解async和await:

1、async只是配合await,用来声明异步方法的关键字; 
2、async和await之间,await才是关键,直接含义——"异步等待",主线程运行至异步方法内的await处,一般情况下主线程会立即返回上层方法,而await处后续的任务(方法)会新开线程继续执行,新开线程在执行“等待”出任务(方法)结果后,会接着运行完异步方法内await后余下的代码部分。

这就是async和await的核心!!!!

基本结构如下

修饰符+async+返回类型+方法名

{ 非异步的内容

  await 任务(Task) : 可以用另外一个方法来返回任务,也可以直接在此利用委托,匿名函数,Lambda表达式来在任务中书写异步代码 都是一样的。

 任务结束后执行的内容  这也是在新开的线程中执行。

}

具体见一下代码:

    private static void Main(string []args)
        {
            //调用异步方法:
            Console.WriteLine("Main is running on thread" + Thread.CurrentThread.ManagedThreadId);
            Fun2Async();
            Console.WriteLine("瞧!在执行await时,我也回到上层方法了");
            Console.ReadKey();
        }
        //异步方法必须用async关键字标识
        public static async void FunAsync()
        {
            Console.WriteLine("FunAsync is running on thread" + Thread.CurrentThread.ManagedThreadId);
            //主线程会返回上层方法中继续执行
            //await是异步的核心  这个等待功能有非常强大的的作用:1.Task新开线程 2.await用于处理这种异步
            await Task.Run(() =>
                {
                    Console.WriteLine("Task is running on thread" + Thread.CurrentThread.ManagedThreadId);
                    Thread.Sleep(5000);
                    Console.WriteLine("Task is ended");
                });
           //Task中的代码执行完毕  下面的代码会继续在新开线程中执行
            Console.WriteLine("I was in thread" + Thread.CurrentThread.ManagedThreadId);
        }

技术分享

下面来看下其它的表现形式:

 //异步方法必须用async关键字标识
        public static async void FunAsync()
        {
            Console.WriteLine("FunAsync is running on thread" + Thread.CurrentThread.ManagedThreadId);
            //主线程会返回上层方法中继续执行
            //await是异步的核心  这个等待功能有非常强大的的作用:1.Task新开线程 2.await用于处理这种异步
            await myTask();
           //Task中的代码执行完毕  下面的代码会继续在新开线程中执行
            Console.WriteLine("I was in thread" + Thread.CurrentThread.ManagedThreadId);
        }
       public static Task myTask()
       {
           Console.WriteLine("Now is runing on thread"+Thread.CurrentThread.ManagedThreadId);//特殊情况 这儿会在调用Task的方法中运行,而且比Task先执行,
           return 
            Task.Run(() =>
                {
                    Console.WriteLine("Task is running on thread" + Thread.CurrentThread.ManagedThreadId);
                    Thread.Sleep(5000);
                    Console.WriteLine("Task is ended");
                });
       }

当然 异步方法可以嵌套使用!!!!!!!!!!!!!!!!!!!

只需要把下级的异步方法写入一个Task当中,再用上级的异步方法await这个Task.

代码如下:

//异步方法必须用async关键字标识
        public static async void FunAsync()
        {
            Console.WriteLine("FunAsync is running on thread" + Thread.CurrentThread.ManagedThreadId);
            //主线程会返回上层方法中继续执行
            //await是异步的核心  这个等待功能有非常强大的的作用:1.Task新开线程 2.await用于处理这种异步
            await myTask();
           //Task中的代码执行完毕  下面的代码会继续在新开线程中执行
            Console.WriteLine("I was in thread" + Thread.CurrentThread.ManagedThreadId);
        }
       public static Task myTask()
       {
           //特殊情况 这儿会在调用Task的方法中运行,而且比Task先执行,
           Console.WriteLine("Now is runing on thread"+Thread.CurrentThread.ManagedThreadId);

           return 
            Task.Run(() =>
                {
                    Console.WriteLine("Task is running on thread" + Thread.CurrentThread.ManagedThreadId);
                    Thread.Sleep(5000);
                    Console.WriteLine("Task is ended");
                });
       }

       //下面来异步方法嵌套调用:
        public static async void ParenAsync()
        {
            Console.WriteLine("ParenAsync is running on thread" + Thread.CurrentThread.ManagedThreadId);
            //这儿使用的是第一个列子的lambda表达式。
            await Task.Run(() =>
                {
                    FunAsync();//将低级的异步方法写在了Task中。。。。。
                });
           
            Console.ReadKey();
        }

一切都是围绕await和Task进行,原理相当简单。

下面总结一下:

1.性能上: Task>ThreadPool>Thread 

2.await后接的方法都是Task或Task<T>类型方法,或者直接就是Task对象;

3.传统委托<匿名方法<Lambda表达式  三者内在都是相同的 而且都与传统委托相同。只是后两者更加简洁,方便

Task和Lambda需要继续理解,

.net4.5的异步 async await 和Task

标签:

原文地址:http://www.cnblogs.com/Huaran1chendu/p/4851521.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!