多线程
1.进程---线程---多线程---同步和异步
2.委托启动和异步调用
3.多线程特点:不卡主线程--速度快---无序性
4.异步的回调和状态参数
5.异步等待三种三种方式
6.异步返回值
进程:计算机概念,程序在服务器运行时占据全部计算资源综总和
虚拟的,
线程:计算机概念,进程在响应操作时最小单位,也包含CPU 内存 网络 硬盘IO
虚拟的概念,更加看不见摸不着
一个进程会包含多个线程;线程隶属于某个进程,进程销毁线程也就没了
句柄:其实是个long数字,是操作系统标识应用程序
多线程:计算机概念,一个进程有多个线程同时运行
Thread类是C#语言对线程对象的一个封装
为什么可以多线程呢?
1. 多个CPU的核可以并行工作,
4核8线程,这里的线程指的是模拟核
2.CPU分片,1s的处理能力分成1000份,操作系统调度着去响应不同的任务
从宏观角度来说,感觉就是多个任务在并发执行
从微观角度来说,一个物理cpu同一时刻只能为一个任务服务
并行:多核之间叫并行
并发:CPU分片的并发
同步异步:
同步方法:发起调用,完成后才继续下一行;非常符合开发思维,有序执行;
诚心诚意的请人吃饭,邀请Nick,Nick要忙一会儿,等着Nick完成后,再一起去吃饭
异步方法:发起调用,不等待完成,直接进入下一行,启动一个新线程来完成方法的计算
客气一下的请人吃饭,邀请亡五,亡五要忙一会儿,你忙着我去吃饭了,你忙完自己去吃饭吧
1. thread:线程等待,回调,前台线程/后台线程
2. threadpool:线程池使用,设置线程池,ManualResetEvent
3. 扩展封装thread&threadpool回调/等待 异步方法 1 同步方法卡界面:主线程(UI线程)忙于计算,无暇他顾
异步多线程方法不卡界面:主线程闲置,计算任务交给子线程完成
改善用户体验,winform点击个按钮不至于卡死;
web应用发个短信通知,异步多线程去发短信;
2 同步方法慢,只有一个线程计算
异步多线程方法快,因为5个线程并发计算
12658ms 3636ms 不到4倍 CPU密集型计算(资源受限)
10126ms 2075ms 差不多5倍,也不到5倍,Sleep(资源够用)
多线程其实是资源换性能,1 资源不是无限的 2 资源调度损耗
一个订单表统计很耗时间,能不能多线程优化下性能? 不能!这就是一个操作,没法并行
需要查询数据库/调用接口/读硬盘文件/做数据计算,能不能多线程优化下性能? 可以,多个任务可以并行
线程不是越多越好,因为资源有限,而且调用有损耗
3 同步方法有序进行,异步多线程无序
启动无序:线程资源是向操作系统申请的,由操作系统的调度策略决定,所以启动顺序随机
同一个任务同一个线程,执行时间也不确定,CPU分片
以上相加,结束也无序
使用多线程请一定小心,很多事儿不是相当然的,尤其是多线程操作间有顺序要求的时候,
通过延迟一点启动来控制顺序?或者预计下结束顺序? 这些都不靠谱!
1.回调:将后续动作通过回调参数传递进去,子线程完成计算后,去调用这个回调委托
2. 通过IsComplate等待,卡界面--主线程在等待,边等待边提示

浙公网安备 33010602011771号