首页 > 代码库 > 《C#本质论》读书笔记(18)多线程处理

《C#本质论》读书笔记(18)多线程处理

.NET Framework 4.0 看(本质论第3版)
.NET Framework 4.5 看(本质论第4版)

.NET 4.0为多线程引入了两组新API:TPL(Task Parallel Library,任务并行库)和PLINQ(Parallel LINQ,并行LINQ)。

18.1 独立线程的运行和控制

       通过 System.Threading.Tasks.Task 类在托管代码中公开各种API,该类代表的是一个异步操作。然而,一个 Task 不直接映射到一个非托管线程。相反, Task 为底层的非托管线程构造提供了一定程度的抽象

       不是每次创建安一个 Task 时会创建一个线程。相反, Task 会从线程池请求一个线程。线程池针对 Task 请求,会判断是否需要创建一个全新线程,还是分配一个现有的线程。

       通过将线程概念抽象为 Task ,开发人员不必操心何时创建一个新的操作系统线程,何时重用一个现有线程。换言之,降低了高效管理线程所涉及的复杂性

 编写 Task 时,需要分配希望 Task 执行的一组指令,然后启动 Task 。指令的分配基本上都靠委托。
      
  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         const int Repettitions = 10000;  
  6.         Task task = new Task(() =>  
  7.         {  
  8.             for (int count = 0; count < Repettitions; count++)  
  9.             {  
  10.                 Console.Write(‘-‘);  
  11.             }  
  12.         });  
  13.         task.Start();  
  14.         for (int count = 0; count < Repettitions; count++)  
  15.         {  
  16.             Console.Write(‘+‘);  
  17.         }  
  18.   
  19.         task.Wait();  
  20.     }  
  21. }  
技术分享
程序在声明了Task之后,执行了一个Start()调用。除非执行这个调用,否则为Task指定的Action是不会开始执行的。
task.Wait()调用强迫主线程(正在执行的第2个for循环线程)停止,并“等待”分配给task的所有工作执行完。







null


《C#本质论》读书笔记(18)多线程处理