我建议你阅读我的async介绍帖子 http://blog.stephencleary.com/2012/02/async-and-await.html;它解释了如何async
and await
关键词有效。然后,如果您有兴趣编写异步代码,请继续我的async最佳实践文章 https://msdn.microsoft.com/en-us/magazine/jj991977.aspx.
介绍帖子的相关部分:
异步方法的开头就像任何其他方法一样执行。也就是说,它同步运行,直到遇到“等待”(或引发异常)。
所以这就是为什么控制台代码示例中的内部方法 https://stackoverflow.com/questions/33711136/thread-returning-to-thread-pool-when-using-await(没有await
)同步运行。
等待检查等待以查看它是否已经完成;如果可等待已经完成,则该方法将继续运行(同步地,就像常规方法一样)。
所以这就是为什么控制台代码示例中的外部方法 https://stackoverflow.com/questions/33711136/thread-returning-to-thread-pool-when-using-await(那是await
同步的内部方法)正在同步运行。
稍后,当可等待完成时,它将执行异步方法的其余部分。如果您正在等待内置的可等待对象(例如任务),则异步方法的其余部分将在“等待”返回之前捕获的“上下文”上执行。
这个“上下文”是SynchronizationContext.Current
除非是null
,在这种情况下是TaskScheduler.Current
。或者,更简单的版本:
这个“背景”到底是什么?
简单回答:
- 如果您位于 UI 线程上,那么它就是 UI 上下文。
- 如果您正在响应 ASP.NET 请求,那么它就是 ASP.NET 请求上下文。
- 否则,它通常是线程池上下文。
将所有这些放在一起,您可以想象async
/await
像这样工作:该方法被分成几个“块”,每个块await
充当方法的分割点。第一个块始终同步运行,并且在每个分割点它可以同步或异步继续。如果它异步继续,那么它将在捕获的上下文中继续(默认情况下)。 UI 线程提供将在 UI 线程上执行下一个块的上下文。
因此,为了回答这个问题,UI 线程的特殊之处在于它们提供了SynchronizationContext
该队列返回到同一个 UI 线程。
我认为没有人希望这个论坛上的任何人继续讨论相关主题,例如它们出现在评论中,所以最好提出一个新问题。
嗯,Stack Overflow 专门是not旨在成为一个论坛;这是一个问答网站。因此,这不是一个要求详尽教程的地方;而是一个地方。当您在尝试让代码正常运行时遇到困难,或者在尽一切努力研究之后仍不明白某些内容时,可以到这里来。这就是为什么对 SO 的评论(有目的地)受到限制 - 它们必须简短,没有漂亮的代码格式等。本网站上的评论旨在澄清,而不是作为讨论或论坛主题。