《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. task.Wait();
  19. }
  20. }



程序在声明了Task之后,执行了一个Start()调用。除非执行这个调用,否则为Task指定的Action是不会开始执行的。

task.Wait()调用强迫主线程(正在执行的第2个for循环线程)停止,并“等待”分配给task的所有工作执行完。

null

时间: 2024-11-06 08:15:38

《C#本质论》读书笔记(18)多线程处理的相关文章

存储器的保护(一)——《x86汇编语言:从实模式到保护模式》读书笔记18

本文是原书第12章的学习笔记. 说句题外话,这篇博文是补写的,因为让我误删了,可恶的是CSDN的回收站里找不到! 好吧,那就再写一遍,我有坚强的意志.司马迁曰:“文王拘而演<周易>:仲尼厄而作<春秋>:屈原放逐,乃赋<离骚>:左丘失明,厥有<国语>:孙子膑脚,<兵法>修列:不韦迁蜀,世传<吕览>……”好了,不煽情了,进入正题. 第12章的代码如下. 1 ;代码清单12-1 2 ;文件名:c12_mbr.asm 3 ;文件说明:硬盘主引

闭包在.NET下的实现(编译器玩的小把戏)-----C#本质论读书笔记

参加工作以来,拜读过很多大作.有好多书读的时候感觉大彻大悟,不自觉的发出‘哦...’这样的感叹.但是随着杀猪刀(时间)不断的飞逝,不仅给我脸上带来了皱纹,还带走了不少前人总结和归纳的知识点和那些我还没来得及吸收的宝贵财富.好记性不如烂笔头,我决定开始写一些读书的笔记和工作上的心得,最好是两者能够结合起来,把知识真正的自己转化成自己的能力. 下面进入正题.闭包在程序员的日常工作几乎无所不在,当然不仅是工作,面试的时候经常也会有相关的题目.看过很多博客园上的朋友都有解释,每次重温都有‘哦...’的感

从构造函数说开去---C#本质论读书笔记

记得一年之前在写代码的时候问了小伙伴一个问题,我说:“你说如果我在声明的时候初始化,它会在对象初始化的哪个阶段被赋值?” 小伙伴想了想回答我:“还是在构造函数里面给变量初始化吧.” 程序当口,时间比较紧,没有空去验证一下这个问题,后来也就慢慢淡忘了. 这个假期翻开“C#本质论”正好里面也提到了这种情况,虽然只是一笔带过,但是也勾起了我的回忆,那今天就来记录一下这个疑问以及它延伸出来的一些知识点. 1.普通构造函数 public class ConstructionTest    {       

《Linux内核设计与实现》读书笔记 18

第十八章调试 18.1 准备开始          需要准备的东西: l  一个bug:大部分bug通常都不是行为可靠而且定义明确的 l  一个藏匿bug的内核版本:找出bug首先出现的版本 l  相关内核代码的知识和运气 最好能让bug重现,有一些bug存在而且有人没办法让他重现,因为内核与用户程序和硬件间的交互很微妙. 18.2内核中的bug 可以有无数种原因产生,表象也变化多端.代码中的错误往往引发一系列连锁反应,目击者才看到bug. 18.3通过打印来调试 内核提供了打印函数printk

C#本质论读书笔记:第一章 C#概述|第二章 数据类型

第一章 1.字符串是不可变的:所有string类型的数据,都不可变,也可以说是不可修改的,不能修改变量最初引用的数据,只能对其重新赋值,让其指向内存中的一个新位置. 第二章 2.1 预定义类型或基本类型: C#语言的基本类型包括8种整数类型,2种用于科学计算的二级制浮点类型,1种用于金融计算的十进制浮点类型,1种布尔类型以及一种字符类型. 2.1.1 整数类型: 要注意int32的范围,如果是要保存10位以上的数字编号的时候,要么使用string,要么使用int64,因为int32只能保存到10

大话设计模式读书笔记--18.命令模式

定义 命令模式定义: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作 比如: 吃烤串时, 客人点烤羊肉,烤鸡肉, 服务员记录下客人的点餐记录,然后通知厨师开始做 烤羊肉,烤鸡肉是请求对象;服务员是命令请求者;厨师是命令实现者 命令模式将功能(请求)封装成对象 目的 对命令请求者(Invoker)和命令实现者(Receiver)的解耦,方便对命令进行各种控制. 模式结构 代码实现 场景: 去饭店吃烤串 代码: 点击下载 特点和使用场

C#本质论读书笔记

1.常量 const  特征: 常量必须在声明时初始化,指定了值后,就不能再修改了 常量总是静态的,不必(实际上,是不允许)在常量声明中包含修饰符 static 不能从一个变量中提取的值来初始化常量,如果需要这么做,应使用只读字段 ??? 2.引用类型和值类型 区别:值类型直接存储其值 而 引用类型存储的是对值引用的地址 :值类型存储在堆栈中,而引用类型存储在托管堆上 3.所有整数类型的变量都能赋予十进制或者十六进制的值,后者需要 0x 前缀 long x =0x12ab; 为了把键入的值指定为

Programming in Scala (Second Edition) 读书笔记18 Stateful Object

1. In previous chapters, we put the spotlight on functional (immutable) objects 在前面的章节,我们把焦点放在了函数式对象上 We did so because the idea of objects without any mutable state deserves to be better known 函数式对象更容易被理解,它永远只有一种状态 However, it is also perfectly poss

存储器的保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记20

存储器的保护(三) 改动本章代码清单,使之能够检測1MB以上的内存空间(从地址0x0010_0000開始,不考虑快速缓存的影响).要求:对内存的读写按双字的长度进行.并在检測的同一时候显示已检測的内存数量.建议对每一个双字单元用两个花码0x55AA55AA和0xAA55AA55进行检測. 上面的文字选自原书第12章的习题1. 这篇博文就讨论一下这道题.由于是初学,我不正确自己做太高的要求.仅仅要实现功能就可以. 代码清单 ;文件说明:第12章习题-1 ;创建日期:2016-3-7 ;------

《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(2)-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协