异步编程(一)
异步是与同步相对的,是一种时序上的概念,即事件处理顺序。
如果A事件需要等待B事件完成才能运行,那么A与B就是同步的;相反的,如果A事件运行不需要等待B事件的完成,也就是说,B还在运行,A就可以自己决定是否需要运行,那么A与B就是异步的。
可见,同步与异步的关键在于是否需要等待。
有一个很容易跟异步混淆的概念是多线程,其实混淆他们是没有区分这两个词义。
异步是对时序状态的描述,而多线程是一种技术手段的名称。我们换一种说法:异步执行状态,多线程手段。
异步可以由多线程来实现,也可由其他技术手段来实现;
多线程可以实现异步操作,也可以实现其他运行要求。
实现异步的手段有很多:
1.Task
2.async/await
3.委托(Action、Func)
4.并行编程(任务并行库TPL)
微软官方文档推荐使用TPL
任务并行库 (TPL) 2017/03/30 任务并行库 (TPL) 是 System.Threading 和 System.Threading.Tasks 空间中的一组公共类型和 API。 TPL 的目的是通过简化将并行和并发添加到应用程序的过程来提高开发人员的工作效率。 TPL 动态缩放并发的程度以最有效地使用所有可用的处理器。
此外,TPL 还处理工作分区、ThreadPool 上的线程调度、取消支持、状态管理以及其他低级别的细节操作。 通过使用 TPL,你可以在将精力集中于程序要完成的工作,同时最大程度地提高代码的性能。 自 .NET Framework 4 起,首选 TPL 编写多线程代码和并行代码。 但是,并不是所有代码都适合并行化。 例如,如果某个循环在每次迭代时只执行少量工作,或它在很多次迭代时都不运行,那么并行化的开销可能导致代码运行更慢。
此外,像任何多线程代码一样,并行化会增加程序执行的复杂性。 尽管 TPL 简化了多线程方案,但我们建议你对线程处理概念(例如,锁、死锁和争用条件)进行基本的了解,以便能够有效地使用 TPL。