lar*_*ryq 6 asynchronous async-await
我正在尝试使用Async CTP并且非常喜欢它.我确实从白皮书中提出了一个问题来解释它.在其中,它说:
重要的是要理解异步方法(如白皮书中列出的示例方法)不能在自己的线程上运行.
如果它们不在自己的线程上运行,异步行为如何工作?在(比如说)UI和"await"关键字创建的Task之间的现有线程上是否有很多上下文切换?
当您调用异步方法时,它最初是同步的.在它等待之前它甚至没有机会异步.
在每个等待表达,GetAwaiter()被等待的等待你.然后IsCompleted在awaiter上测试该物业.如果任务已经完成,则该方法将保持同步.
否则,在OnCompletedawaiter上调用该方法,以向其添加延续,然后在任务完成时回调该延迟.async方法本身在第一次命中一个尚未完成的await表达式时返回给调用者.
这种线程的确切性质取决于所涉及的等待,但在异步CTP中Task<T>,TaskAwaiter将使用当前任务调度程序来安排延续.对于WinForms/Silverlight/WPF,这意味着如果您在UI线程上启动异步方法,它将继续在UI线程上.否则(例如,如果您已经在线程池线程中,或者您正在从控制台应用程序中使用它),则继续将在线程池线程上运行.当然,如果你真的想要,你可以自己更改当前的任务调度程序.
同样不同awaiters不具备使用安排的延续TaskScheduler.Current.例如,我的协程延续基本上保持一个连续队列来执行,并继续前进直到他们去.我的ComeFrom延续最终变得更加离奇:)
有关异步功能如何在幕后工作的更多信息,请阅读我的Eduasync博客系列,深入研究它.
希望你一般都喜欢这个功能......我觉得这非常令人兴奋.
| 归档时间: |
|
| 查看次数: |
289 次 |
| 最近记录: |