C# 多线程进阶二
- 一. 并行编程Parallel
- 二. 任务调度器
- 三. async/await
- 四. 线程安全
一. 并行编程Parallel
本质是对task的进一步封装,一些复杂的循环计算,可以考虑使用Parallel实现并行执行。(可以指定cpu的参与个数)
二. 任务调度器
场景:winform 子线程更新UI,(跨线程访问UI)
以前一般用法delegate和invoke来实现跨线程更新UI,现在可以使用Task调度器
三. async/await
async和await一般成对出现,本质还是task,只不过语法更加简洁。
主线程调用async/await方法时,主线程碰到await会返回执行后续主线程的代码,await后面的代码会等着task任务完成后再继续执行(由子线程)
四. 线程安全
线程安全: 如果你的代码在进程中有多个线程同时运行这一段,如果每次运行的结果都跟单线程运行时的结果一致 ,那么就是线程安全的。
线程安全问题: 一般有全局变量/共享变量/静态变量/硬盘文件/数据库的值,只要多线程都能访问和修改,就会存在线程安全问题。
解决办法:
1.避免去操作同一个变量
2.如果无法避免,可以使用锁机制,以下是使用锁机制的使用
注意: 使用锁的时候要避免死锁到情况出现。
多线程中,有各种各样到锁,在这里没有时间一一列举。等使用到时候,再去查吧。
1.用户模式锁
volatile关键字的使用
SpinLock(旋转锁)
2.内核模式锁:事件锁、信号量、互斥锁、读写锁
通常不建议随便使用内核模式锁,资源付出相对较大。
3.动态计数锁
限制线程的一个机制,比较常用。
4.监视锁
限制线程个数的锁
5.其他