关于多线程和异步相信不少人都有疑问,它们之间到底有什么区别呢?
从知乎上看见一个比喻还是比较好理解的:
现在假设整个城市就只有1个火车,1个售票员,每个乘客咨询售票员后需要思考1分钟再决定买哪趟车的票。
异步
在买票的人咨询后,需要思考1分钟,马上靠边站,但不用重新排队,什么时候想清楚可以立马去跟售票员去买票。在该人站在旁边思考的时候,后面的人赶紧上去接着买。这时候队伍是很快的挪动的,没有阻塞,售票员的最大化的效率。
多线程
火车站开n个窗口(但还是只有一个人售票),外面同时排n个队,售票员回答咨询者问题后,立马马上去下个窗口,然后继续轮换到下个窗口.....哪个窗口的人决定好了,售票员立马过去买给他。这个时候乘客比较简单,但万一那个队伍有人思考半天纠结,后面的人就悲剧了。
搞清楚一个点
异步调用并不是要减少线程的开销,它的主要目的是让调用方法的执行线程不需要同步等待在这个函数调用上,从而可以让执行线程继续执行它下面的代码。与此同时, 系统会通过从ThreadPool中取一个线程来执行,帮助我们将我们要写/读的数据发送到网卡.由于不需要我们等待, 我们等于同时做了两件事情. 这个效果跟自己另外启动一个线程来执行等待方式的写操作是一样的.但是, 异步线程可以利用操作系统/.Net的线程池, 系统可以根据吞吐量动态的管理线程池的大小。
异步、多线程调用本质
https://www.cnblogs.com/dream844/archive/2012/06/12/2546083.html
异步IO操作
在.NET Framework 4.5+之后,微软提供了 await async ask,使得我们在异步编程的时候可以像同步一样的逻辑思考,屏蔽了.NET Framework 4.5之前进行异步编程的复杂度(前期都是异步委托实现)