异步编程
2016-05-04 11:00:21参考
异步与多线程的区别(异步是目的,多线程是实现它的一种方式,异步的优先级有时候比主线程还高) - 子福当自强 - 博客园
.NET 异步详解 --能说清楚异步与多线程的区别,涉及到操作系统原理
await,async 我要把它翻个底朝天,这回你总该明白了吧
异步开发是什么
异步开发,就是利用线程技术,当执行一个占用时间长的任务时,不会阻止用户其它工作,而且其完成时会通知用户。
虽然是通过多线程来实现异步,但是因为一般异步时耗时的操作都不是针对CPU的,所以对CPU压力影响不大。
异步本质是通过线程池提高线程的利用率。
- 异步采用IO的DMA模式,不会消耗CPU资源。计算密集的工作,采用多线程。IO密集的工作,采用异步
- 举例:网络爬虫爬数据,如果数据很庞大,这个时候就需要使用异步了。
- DMA:Direct Memory Access是IO的操作模式,可以直接访问内存,不经过CPU,不消耗CPU资源。
- 异步和多线程区别就是,充分利用DMA释放CPU压力。
- 异步实现方式:.net中实现异步的方式有定时器和多线程,一般都是使用多线程。
**使用场景:**要执行耗时且不需要立刻返回结果的操作,如:I/O操作、网络操作
争议:
有种说法是:异步是不阻塞当前主线程执行,通过子线程去执行,还有总说法刚好相反,具体参考:异步与线程阻塞
同步、异步、并行区别
同步:代码执行顺序默认是一行一行执行的,要等当前行的代码执行完后,才会执行下一行的代码。
异步:不用等当前行代码执行完毕就会执行下一行的代码。异步编程是一项关键技术,可以直接处理多个核心上的阻塞 I/O 和并发操作
并行:许多个人计算机和工作站都有多个 CPU 内核,以便多个线程能够同时执行。 为了利用硬件,你可以对代码进行并行化,以将工作分摊在多个处理器上。
并行和多线程、异步和多线程有啥关系?
异步和多线程:多线程是创建多个线程,消耗的是CPU,异步呢?
异步方法返回类型:void、Task、Task
异步编程模式:
- 基于任务的异步模式 (TAP):使用Task、async 、await 方式,推荐
- Task类:示一个异步操作。要求.NET Framework4.0及以上版本
- Task.WhenAll:所有提供的任务已完成时,创建将完成的任务。要求.NET Framework4.5及以上版本
- 可以通过WhenAll(方法1,方法2,方法3)方式,也可以通过Task[]数组方式
- Task.ContinueWith :创建一个在目标Task 完成时异步执行的延续任务。要求.NET Framework4.0及以上版本
- 直接用lambda表达式创建方法ContinueWith(((t) => { 方法体; })),或则调用方法ContinueWith(Action
) ...
- 直接用lambda表达式创建方法ContinueWith(((t) => { 方法体; })),或则调用方法ContinueWith(Action
- async:使用 async 修饰符可将方法指定为异步方法
- await:等待,await 运算符暂停对其所属的 async 方法的求值,直到其操作数表示的异步操作完成。
- 基于事件的异步模式 (EAP):不推荐
- 异步编程模型 (APM) :使用BeginRead 、EndRead、 AsyncCallback,不推荐