码迷,mamicode.com
首页 > Windows程序 > 详细

c# async await

时间:2017-06-28 14:28:02      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:switch   基本   delay   void   async   res   obj   div   c#   

1.async await

private void Form2_Load(object sender, EventArgs e)
        {
            Console.WriteLine("main:"+Thread.CurrentThread.ManagedThreadId);
            DoSth();  //不加await不等待DoSth执行完成直接弹出form2_load
            MessageBox.Show("form2_load");
          
        }

        async Task DoSth()
        {
            Do1(); //不加await不等待Do1执行完毕(先弹出 DoSth executed after 3 后弹出 do1 after 5s)相当于并发,加了await就会等待Do1执行完再执行后续相当于阻塞
            await Task.Delay(3000);   //这里不能用Thread.Sleep代替 原因见结尾处红色处文字(如果不开线程则Thread.sleep会阻塞住主线程)
            Console.WriteLine("dosth:"+Thread.CurrentThread.ManagedThreadId);
            MessageBox.Show("DoSth executed after 3s");
        }

        async Task Do1()
        {
            await Task.Delay(5000);
            Console.WriteLine("do1:"+Thread.CurrentThread.ManagedThreadId);
            MessageBox.Show("do1 after 5s");
        }

  

线程id输出3个都一样 原因(http://www.cnblogs.com/mushroom/p/4575417.html):

有言论说Async不用开线程,也有说需要开线程的,从单一方面来讲都是对的,也都是错的。 上面源码是从简分析的,具体async内部会涉及到线程上下文切换,线程复用、调度等。 想深入的同学可以研究下ExecutionContextSwitcher、 SecurityContext.RestoreCurrentWI、ExecutionContext这几个东东。

其实具体的物理线程细节可以不用太关心,知道其【主线程A逻辑->异步任务线程B逻辑->主线程C逻辑】这个基本原理即可。 另外Async也会有线程开销的,所以要合理分业务场景去使用。

 

From:http://www.cnblogs.com/xuejianxiyang/p/7089280.html

c# async await

标签:switch   基本   delay   void   async   res   obj   div   c#   

原文地址:http://www.cnblogs.com/xuejianxiyang/p/7089280.html

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