该文章仅为个人理解,如有错误请指正,标红内容为重点,会有针对异步的多个文章,包含Task,APM(BeginInvoke,EndInvoke)等。
一、基本概念:
- Async/await 关键字是在.Net 4.5引入的关键字来创建自动延续任务实现异步调用。
- async/await是语法糖,等价于task.Run().ContinueWith(action,Task.FromCurrentSynchronizationContext())。
- 延续:是.Net提供一种异步编程模式,用来代替阻塞、等待、轮询异步调用的操作。
- Task的ContinueWith方法:在task任务完成后继续执行ContinueWith中的代码,除非指定线程,默认情况下ContinueWith中的代码在线程池中的线程运行。
- Task.ContinueWith指定线程,由于ContinueWith中的代码需要在指定的线程运行例如更新UI控件必须在UI线程中执行,使用方法重载,传递TaskScheduler参数,TaskScheduler.FromCurrentSynchronizationContext()可以捕获调用线程同步上下文,可以保证ContinueWIth中的代码封送给指定的同步上下文。
- 同步上下文:同步上下文的工作就是确保调用在正确的线程上执行。任何一方都可以提供一个执行的上下文,允许其他第三方向其封送调用。创建Form控件或Form时,会调用父类Control的构造函数会检查当前线程是否拥有同步上下文,如果没有则会安装WindowsFormsSynchronizationContext作为线程的同步上下文。
二