参考博客:
https://www.cnblogs.com/yswenli/p/11987377.html
https://www.cnblogs.com/wisdomqq/archive/2012/03/26/2412349.html
https://www.cnblogs.com/scy251147/archive/2012/03/03/2378477.html
1. 异步编程的相关概念
1.1 并发、并行、异步、多线程的概念
- 并发:对于某个系统,需要同时处理同个用户请求,多个用户请求的过程和处理多个用户请求的过程就叫并发。
- 并行:同一时刻有多件事情同时被执行,这些指令可能执行于同一CPU的多核上,或者多个CPU上,或者多个物理主机甚至多个网络中。
- 异步:和同步相对,同步是顺序执行,而异步是彼此独立,在等待某个事件的过程中继续做自己的事,不要等待这一事件完成后再工作。异步不一定是多线程的,单线程也可以异步,通过线程切换,可以“同时”处理多个任务。异步和并行并不是完全互斥的,有重合的情况;两种概念只是侧重点不同。
- 多线程:一般指同一进程中多个线程协作运行。
2. 直接使用多线程的异步方式
3. 基于BackgroundWorker的异步方式
3.1 BackgroundWorker类介绍
BackgroundWorker类后新建另一个线程,在后台持续运行某项工作,不持续和主线程进行通信。BackgroundWorker类结果如下图所示:
1)四个属性
- WorkerReportsProgress(R/W):表示后台线程的进度信息是否汇报给主线程。
- WorkerSupportsCacllation(R/W) :表示后台线程是否支持在主线程中取消。
- IsBusy®:表示后端线程是否忙(是否完成)
- CancellationPending®:表示是否在主线程中取消了后台线程。
2)三个事件(由主线程指定)
DoWork:用于承载异步操作。当调用BackgroundWorker.RunWorkerAsync()时触发。需要注意的是,由于DoWork事件内部的代码运行在非UI线程之上,所以在DoWork事件内部应避免于用户界面交互,而于用户界面交互的操作应放置在ProgressChanged和RunWorkerCompleted事件中。对应的委托类型如下,sender表示调用对象(即BackgroundWorker本身),DoWorkEventArgs包含三个参数:
Argument表示
-
基于BeginInvoke和EndInvoke的异步方式
-
基于Task的异步方式
Task是基于任何的异步模式的中心组件之一,表示异步方式的单个操作。 -
并行计算
-
计时器
异步编程
async方法在开始时以同步方式执行,在async方法内部,await关键字对它参数执行一个异步等待,它首先检查操作是否已经完成,如果完成,就继续运行(同步方式),否则,会暂停async方法,并返回.留下一个未完成的task,一段时间后,操作完成,async方法就恢复执行.
任务和线程的区别:
1、任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行。
2、任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比线程池有很小的开销和精确的控制。
Task 类表示通常以异步方式执行的单个操作,
并行,一般指并行计算,是说同一时刻有多条指令同时被执行,这些指令可能执行于同一CPU的多核上,或者多个CPU上,或者多个物理主机甚至多个网络中。
多线程,一般指同一进程中多个线程(包含其数据结构、上下文与代码片段)协作运行。在多核计算机中多个线程将有机会同时运行于多个核上,如果线程中进行的是计算,则行成并行计算。
异步
使用线程异步化
APM模式(就是BeginXXX和EndXXX成对出现。)
EAP模式(就是Event based, 准确说来就是任务在处理中或者处理完成,会抛出事件)
Task