在应用程序中 使用多线程 要仔细规划
- 太多线程: 导致资源问题
- 线程不足: 又会使应用程序执行缓慢
使用 任务,可以获得线程的抽象
- 抽象 有助于避免创建过多的线程,因为 线程 是在池中 重用的
创建多个任务的各种方法
Parallel
类:实现任务和数据的并行性Parallel.Invoke()
Parallel.ForEach()
Parallel.For()
Task
类:获得对并行编程的全面控制
任务
- 可以 在主调线程中异步运行
- 可以 使用线程池中的线程
- 可以 创建独立的新线程
- 可以 提供一个层次结构,允许创建子任务
- 可以 提供取消完成层次结构的方法
取消架构
提供了一种标准机制,不同的类 可以 以相同的方法 使用它来提前取消某个任务
几个.NET 同步对象
lock
关键字:简单的同步Monitor
类:允许设置超时Mutex
类:在进程间进行同步Semephore
类:其对象为带有计数的同步对象,该计数是允许并发运行的任务数量**Event
类:通知其他任务 已准备好ReaderWriterLock
类:拥有多个读取器和写入器Barrier
类:复杂场景,可以同时运行多个任务,直到达到一个同步点为止。一旦所有任务达到这一点,它们就可以继续同时满足于下一个同步点
有关线程的几条规则
尽力使同步要求最低
- 同步很复杂,且会阻塞线程
- 如果尝试避免共享状态,就可以避免同步。当然,这不总是可行
类的 静态成员 是线程安全的
- 通常,.NET Framework中的类满足这个要求
实例状态不需要是线程安全的
- 为了得到最佳性能,最好在类的外部使用同步功能,而不对类的每个成员使用同步功能
- .NET Framework类的实例成员一般不是线程安全的
- 在MSDN API库中,对于.NET Framework的每个类在"线程安全性"部分,都可以找到相应的信息