《C#本质论》读书笔记(18)多线程处理
.NET Framework 4.0 看(本质论第3版)
18.1 独立线程的运行和控制
编写 Task 时,需要分配希望 Task 执行的一组指令,然后启动 Task 。指令的分配基本上都靠委托。 |
- class Program
- {
- static void Main(string[] args)
- {
- const int Repettitions = 10000;
- Task task = new Task(() =>
- {
- for (int count = 0; count < Repettitions; count++)
- {
- Console.Write('-');
- }
- });
- task.Start();
- for (int count = 0; count < Repettitions; count++)
- {
- Console.Write('+');
- }
- task.Wait();
- }
- }
问题:我什么时候能使用Task的Start()方法?
- 问题:我什么时候能使用Task的Start()方法?只有 Task 处于 TaskStatus.Created 状态时才能使用实例方法 Start() 。
并且,只有在使用 Task 的公共构造函数构造的 Task 实例才能处于 TaskStatus.Created 状态。 - 问题:使用Task.Run()/Task.ContinueWith()/Task.Factory.StartNew()/TaskCompletionSource/异步方法(即使用async与await关键字的方法)……应该调用Start()方法吗?
不应该。不仅不应该,而且也不能,因为此时调用Start()会报异常。从问题1可知:Start()实例方法只适用于TaskStatus.Created状态的Task。由上面提到的方式创建的Task其状态不是TaskStatus.Created,而是如TaskStatus.WaitingForActivation、TaskStatus.Running或TaskStatus.RanToCompletion。
- static void Main(string[] args)
- {
- Task<string> task = Task.Factory.StartNew<string>(
- > PiCalculator.Calculate(100));
- foreach (char busySymbol in Utility.BusySymbols())
- {
- if (task.IsCompleted)
- {
- Console.Write('\b');
- break;
- }
- Console.Write(busySymbol);
- }
- Console.WriteLine();
- // Blocks until task completes.
- Console.WriteLine(task.Result);
- System.Diagnostics.Trace.Assert(task.IsCompleted);
- }
属性 | 解释 | 说明 |
Status |
指明任务的状态。
Created = 0,
WaitingForActivation = 1,
WaitingToRun = 2,
Running = 3,
WaitingForChildrenToComplete = 4,
RanToCompletion = 5,
Canceled = 6,
Faulted = 7, |
获取此任务的 TaskStatus 枚举 |
IsComplete | 不管任务是否出错,IsComplete在任务完成后都被设为true,任何时候只要Status为 5,6,7 就为true。 | 获取此 Task 是否已完成 |
Id | 解决多线程问题(竞争和死锁),Id尤为有用 | 获取此 Task 实例的 ID |
AsyncState | 能跟踪额外的数据。 | 获取在创建 Task 时提供的状态对象,如果未提供,则为 null |
Task.CurrentId | 任何地方都可调用,特别适合调试和诊断性类型的活动 | 返回当前正在执行 Task 的 ID |
- public enum TaskStatus
- {
- // 该任务已初始化,但尚未被计划。
- Created = 0,
- // 该任务正在等待 .NET Framework 基础结构在内部将其激活并进行计划。
- WaitingForActivation = 1,
- // 该任务已被计划执行,但尚未开始执行。
- WaitingToRun = 2,
- // 该任务正在运行,但尚未完成。
- Running = 3,
- // 该任务已完成执行,正在隐式等待附加的子任务完成。
- WaitingForChildrenToComplete = 4,
- // 已成功完成执行的任务。
- RanToCompletion = 5,
- // 该任务已通过对其自身的 CancellationToken 引发 OperationCanceledException 异常
- Canceled = 6,
- // 由于未处理异常的原因而完成的任务。
- Faulted = 7,
- }
- class Program
- {
- static void Main(string[] args)
- {
- /* 创建一个任务 不调用 不执行 状态为Created */
- Task tk = new Task(() =>
- {
- });
- Console.WriteLine(tk.Status.ToString());
- /* 创建一个任务 执行 状态为 WaitingToRun */
- Task tk1 = new Task(() =>
- {
- });
- tk1.Start(); /*对于安排好的任务,就算调用Start方法也不会立马启动 此时任务的状态为WaitingToRun*/
- Console.WriteLine(tk1.Status.ToString());
- /* 创建一个主任务 */
- Task mainTask = new Task(() =>
- {
- SpinWait.SpinUntil(() =>
- {
- return false;
- }, 30000);
- });
- /* 将子任务加入到主任务完成之后执行 */
- Task subTask = mainTask.ContinueWith((t1) =>
- {
- });
- /* 启动主任务 */
- mainTask.Start();
- /* 此时子任务状态为 WaitingForActivation */
- Console.WriteLine(subTask.Status.ToString());
- /* 创建一个任务 执行 后 等待一段时间 并行未结束的情况下 状态为 Running */
- Task tk2 = new Task(() =>
- {
- SpinWait.SpinUntil(() => false, 30000);
- });
- tk2.Start(); /*对于安排好的任务,就算调用Start方法也不会立马启动*/
- SpinWait.SpinUntil(() => false, 300);
- Console.WriteLine(tk2.Status.ToString());
- /* 创建一个任务 然后取消该任务 状态为Canceled */
- CancellationTokenSource cts = new CancellationTokenSource();
- Task tk3 = new Task(() =>
- {
- for (int i = 0; i < int.MaxValue; i++)
- {
- if (!cts.Token.IsCancellationRequested)
- {
- cts.Token.ThrowIfCancellationRequested();
- }
- }
- }, cts.Token);
- tk3.Start(); /*启动任务*/
- SpinWait.SpinUntil(() => false, 100);
- cts.Cancel(); /*取消该任务执行 但并非立马取消 所以对于Canceled状态也不会立马生效*/
- SpinWait.SpinUntil(() => false, 1000);
- Console.WriteLine(tk3.Status.ToString() + " " + tk3.IsCanceled);
- SpinWait.SpinUntil(() => false, 1000);
- Console.WriteLine(tk3.Status.ToString() + " " + tk3.IsCanceled);
- SpinWait.SpinUntil(() => false, 1000);
- Console.WriteLine(tk3.Status.ToString() + " " + tk3.IsCanceled);
- /*创建一个任务 让它成功的运行完成 会得到 RanToCompletion 状态*/
- Task tk4 = new Task(() =>
- {
- SpinWait.SpinUntil(() => false, 10);
- });
- tk4.Start();
- SpinWait.SpinUntil(() => false, 300);
- Console.WriteLine(tk4.Status.ToString());
- /*创建一个任务 让它运行失败 会得到 Faulted 状态*/
- Task tk5 = new Task(() =>
- {
- throw new Exception();
- });
- tk5.Start();
- SpinWait.SpinUntil(() => false, 300);
- Console.WriteLine(tk5.Status.ToString());
- Console.ReadLine();
- }
- }
- class Product
- {
- public string Name { get; set; }
- public string Category { get; set; }
- public int SellPrice { get; set; }
- }
18.1.1 ContinueWith()
18.1.2 task上未处理的异常
18.1.3 取消任务
18.1.4 长时间运行任务
18.1.5 释放一个任务
18.2 并行迭代
18.3 并行执行LINQ查询
18.4 .NET4.0之前的多线程处理
18.5 AppPomain 的未处理异常
转载于:https://www.cnblogs.com/tangge/p/6210535.html
《C#本质论》读书笔记(18)多线程处理相关推荐
- 存储器的保护(一)——《x86汇编语言:从实模式到保护模式》读书笔记18
本文是原书第12章的学习笔记. 说句题外话,这篇博文是补写的,因为让我误删了,可恶的是CSDN的回收站里找不到! 好吧,那就再写一遍,我有坚强的意志.司马迁曰:"文王拘而演<周易> ...
- APUE读书笔记-18终端输入输出-14总结
转载于:https://blog.51cto.com/quietheart/888830
- 易经读书笔记18山风蛊
除弊治乱 象曰 山下有风,蛊:君子以振民育德. 风为巽,巽为入,入而有止,止则不通,不通则蛊生. 蛊:元亨,利涉大川. 先甲三日,后甲三日. 不是说腐败会元亨,而是告诉我们腐败是难免的,只要及时加以整 ...
- 【读书笔记】.NET本质论第四章-Programming with Type(Part Two)
欢迎阅读本系列其他文章: [读书笔记].NET本质论第一章 The CLR as a Better COM [读书笔记].NET本质论第二章-Components(Part One) [读书笔记].N ...
- 存储器的保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记20
存储器的保护(三) 修改本章代码清单,使之可以检测1MB以上的内存空间(从地址0x0010_0000开始,不考虑高速缓存的影响).要求:对内存的读写按双字的长度进行,并在检测的同时显示已检测的内存数量 ...
- 小啊呜产品读书笔记001:《邱岳的产品手记-09》第17讲 产品经理如何获得非权力性的影响力 第18讲 产品案例分析:WWFTogether的情怀设计
小啊呜产品读书笔记001:<邱岳的产品手记-09>第17讲 产品经理如何获得非权力性的影响力 & 第18讲 产品案例分析:WWFTogether的情怀设计 一.今日阅读计划 二.泛 ...
- 读书笔记-人月神话18
有多少书,我读过:有多少事,我做过:记录下学习的点点滴滴,每一天. 回顾一下经典,记录一下悟点. 读书笔记-人月神话 - 没有银弹
- [转]《Python编程金典》读书笔记
<Python编程金典>读书笔记 原文: http://man.chinaunix.net/develop/python/python_howto/python_howto_program ...
- 《Python编程金典》读书笔记
<< Back to man.ChinaUnix.net <Python编程金典>读书笔记 整理:Jims of 肥肥世家 <yjnet@21cn.com> 第一次 ...
最新文章
- groupadd - 建 立 新 群 组
- 揭秘Facebook SLAM技术,如何为人们生活增添奇幻的艺术色彩?
- anki 新的卡片类型_梁宝川:这一类型Anki卡片,你做了吗?
- Pytorch-使用Bert预训练模型微调中文文本分类
- c# SQL CLR 之一
- js 封装经纬度成json_全国经纬度json文件
- 【动态规划】【递归】取数字问题 (ssl 1644)
- 降级安装_如何升级iOS13测试版,还有降级
- NAU8810相关问题
- 中职计算机说课稿三篇,精选中职计算机说课稿三篇-20210609060707.docx-原创力文档...
- python format格式化输出填充符号不起作用_Python格式化输出——format用法示例
- 每卖出一部新款iPhone SE,苹果就要赚1500元?
- python的魔法方法
- Flex beta2+XFire开发实例
- VC6.0调试知识大全
- 数据拟合丨人口预测模型
- C++在windows下获得运行主机的硬件信息:CPU序列号、MAC地址、硬盘序列号、主板序列号
- Roaring位图具有更好的位图性能
- 触发器(数据库原理术语)
- 运行不了cracker.jar?激活MyEclipse
热门文章
- js 拖动层示例[转]
- 计算机英语protocols,计算机网络协议词汇Protocols
- mysql 存储过程逻辑表达 and_MySQL - 存储过程 (二)- 逻辑判断语句
- java 导出csv 格式,java导出csv格式文件的方法
- sap 新建事务_SAP操作常用事务代码(大全)
- c++用二叉树表示代数表达式_C语言:数据结构-二叉树的定义和基本术语和二叉树的性质...
- for 循环里调用ajax,for循环中ajax异步问题如何解决?
- 13.QT信号槽的连接方式
- 开闭操作进行平滑处理与边缘提取
- vs界面竖线光标变成灰色方块,输入时替代已有字符