c# 高级编程 21章496页 【任务和并行编程】【小结】

99 阅读2分钟

在应用程序中 使用多线程 要仔细规划

  • 太多线程: 导致资源问题
  • 线程不足: 又会使应用程序执行缓慢

使用 任务,可以获得线程的抽象

  • 抽象 有助于避免创建过多的线程,因为 线程 是在池中 重用的

创建多个任务的各种方法

  • Parallel类:实现任务和数据的并行性
    • Parallel.Invoke()
    • Parallel.ForEach()
    • Parallel.For()
  • Task类:获得对并行编程的全面控制

任务

  • 可以 在主调线程中异步运行
  • 可以 使用线程池中的线程
  • 可以 创建独立的新线程
  • 可以 提供一个层次结构,允许创建子任务
  • 可以 提供取消完成层次结构的方法

取消架构

提供了一种标准机制,不同的类 可以 以相同的方法 使用它来提前取消某个任务

几个.NET 同步对象

  • lock关键字:简单的同步
  • Monitor类:允许设置超时
  • Mutex类:在进程间进行同步
  • Semephore类:其对象为带有计数的同步对象,该计数是允许并发运行的任务数量
  • **Event类:通知其他任务 已准备好
  • ReaderWriterLock类:拥有多个读取器和写入器
  • Barrier类:复杂场景,可以同时运行多个任务,直到达到一个同步点为止。一旦所有任务达到这一点,它们就可以继续同时满足于下一个同步点

有关线程的几条规则

尽力使同步要求最低

  • 同步很复杂,且会阻塞线程
  • 如果尝试避免共享状态,就可以避免同步。当然,这不总是可行

类的 静态成员 是线程安全的

  • 通常,.NET Framework中的类满足这个要求

实例状态不需要是线程安全的

  • 为了得到最佳性能,最好在类的外部使用同步功能,而不对类的每个成员使用同步功能
  • .NET Framework类的实例成员一般不是线程安全的
  • 在MSDN API库中,对于.NET Framework的每个类在"线程安全性"部分,都可以找到相应的信息