none
.NET 4.5中的Async和Await关键字问题 RRS feed

  • 问题

  • 在.NET 4.5 中提供的Async和Await两个关键字使异步编程更加简单,因为我知道以前异步编程的实现,如APM,EAP等都是创建一个新的线程去执行一些耗时的操作来达到不阻塞UI线程的,因为UI线程和操作耗时的操作在不同的线程上运行,所以此时耗时操作就不会阻塞UI线程,但是Async和Await定义的异步方法,MSDN资料说没有创建新的线程,所有操作都在当前线程运行的,但是为什么这样的操作不会导致阻塞UI线程呢(我测试了,确实是不会阻塞UI线程的),但是我就是很困惑,想知道这个原因是为什么的.希望有人可以回答的,谢谢了。

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年4月25日 15:01

答案

  • hi,

    基本上他门是由Task类实作来的,它是并行运算的类,我门调用时不需要再自行创建线程,骨子里还是会有线程的创建,不知您在哪里看见相关讯习的?


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年4月25日 16:08
  • 这个问题我应该自己找到答案了,找的相关资料只是说用"async"标记的方法,它会在当前线程以同步的方式运行,知道在方法内出现await时,编译器看到await关键字会把这个方法分隔成多个片段,其中在await关键字之前的代码片段是在同步进行的,await关键字的代码片段是异步执行,这些操作是由Task这个对象去操控的,并且当await的方法没完成前,方法会立即返回调用线程中,所以此时肯定不会阻塞主线程即UI线程,当await方面完成后,将会然而以同步的方式运行await关键字后面的代码。其实C# 5.0 中的async和await关键字是基于TAP(基于任务的异步编程模型)的,TAP 是.NET 4.0中新添加的特性,TAP来实现异步编程对于开发人员已经很简单了,但是.NET 4.5为了使异步编程更简单,就添加了async和await关键字来使异步编程更容易编写,其实背后的实现原理应该是与TAP是类似的,只是这些工作微软让编译器帮我们去做了,我们写代码只需要使用好async和await关键字了。

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年4月26日 8:29
  • hello,
    所以我说他门是由Task实作来的~


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年4月26日 16:40

全部回复

  • hi,

    基本上他门是由Task类实作来的,它是并行运算的类,我门调用时不需要再自行创建线程,骨子里还是会有线程的创建,不知您在哪里看见相关讯习的?


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年4月25日 16:08
  • 从这个杂志上看到的:http://msdn.microsoft.com/zh-cn/magazine/hh456403.aspx

    同时从这个博客也可以得知: http://blog.stephencleary.com/2012/02/async-and-await.html

     并且测试的时候异步方法和调用方法是在同一个线程的,因为线程ID是一样的。

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年4月25日 16:11
  • 这个问题我应该自己找到答案了,找的相关资料只是说用"async"标记的方法,它会在当前线程以同步的方式运行,知道在方法内出现await时,编译器看到await关键字会把这个方法分隔成多个片段,其中在await关键字之前的代码片段是在同步进行的,await关键字的代码片段是异步执行,这些操作是由Task这个对象去操控的,并且当await的方法没完成前,方法会立即返回调用线程中,所以此时肯定不会阻塞主线程即UI线程,当await方面完成后,将会然而以同步的方式运行await关键字后面的代码。其实C# 5.0 中的async和await关键字是基于TAP(基于任务的异步编程模型)的,TAP 是.NET 4.0中新添加的特性,TAP来实现异步编程对于开发人员已经很简单了,但是.NET 4.5为了使异步编程更简单,就添加了async和await关键字来使异步编程更容易编写,其实背后的实现原理应该是与TAP是类似的,只是这些工作微软让编译器帮我们去做了,我们写代码只需要使用好async和await关键字了。

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年4月26日 8:29
  • hello,
    所以我说他门是由Task实作来的~


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年4月26日 16:40
  • 已经标记为答案了,很想和你交流的,我的MSN是lizhi5753186@msn.cn,很希望可以认识和交流

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年4月26日 16:41