C# 多线程(17):小总结
前言
本篇内容是小总结和过渡,看完这篇后,就要开始继续学习 C# 多线程中的知识点啦~。
前面,经过 16 篇的学习,我们学习了多线程、锁、线程池、任务、同步、异步等知识,还没有使用到 async、await 这些关键字。
有同学问,现在随便拉一个开源项目,里面几乎都是 async/await 这些组成;使用了 async/await ,结果比不用更加耗性能了;ASP.NET Core 中的管道,异步,回调这些又是啥?
要搞清楚这些,就要好好了解 Task(任务),先别纠结什么关键字,也不用下别人的项目,然后掉头发猜别人为啥这样写。
有同学说我文章里面的示例没有写输出结果,这样主要是为了省一些篇幅,避免赘述,读者编写示例代码能够直接输出结果的,一般不会在文章加上输出占位置;读者可以多写代码,自行测试。
笔者的建议
额,笔者多线程系列的文章中,出现最多的两句话,是 “后面再说” ,“原理的东西不说太多”。
主要原因是,很多知识点是交叉穿插,如果放一堆来讲,会很乱,要将这些知识点分开归纳整理,是很麻烦的。我们学习东西的时候,一些知识点,应该留到后面再看;不要让还没有碰到的东西阻碍学习时间。
另外学习应该是从易到难,先从表面去学习,从代码练手,练习多了,就熟悉门路了,需要的时候再去深入原理。不要一下子把整本书拿来啃。
笔者写这个系列的文章,参考了 《C# 7.0 核心技术指南》、《C# 7.0 本质论》、《C# 多线程编程实战(原书第二版)》、微软文档和 Google 的资料。
《C# 7.0 核心技术指南》、《C# 7.0 本质论》这两本书,对多线程,异步这些方面,对于已经掌握的开发者来说,可以补充知识点,对于初学者就不太友好了,学习路线很曲折,不利于初学者学习。笔者觉得技术指南比本质论好一些。
C# 多线程编程实战(原书第二版)》这边书就没必要看了。。。因为这本书是基于 .NET Fx 4 的,有不少写法是过时的了。另外这边书几乎没用说到原理解析方面的,主要是示例多。示例内容对中文读者也不友好,而且大多数为了示例而示例,对于应用场景方面的使用很缺。
微软文档的话,主要是参考 API 和解释,但是中文翻译一言难尽。文档中的示例,假如说你在学习一个读写的锁,但是里面出现了很多 Task 等的代码一起组成示例。这就很迷,但是这个是文档,不是教程。也不利于系统式学习。
上面的资料和书籍,具体好不好,适合不适合,怎么学,就要看个人怎么选择啦。
复习一下
由于后面学习的内容,跟前面的任务基础紧密相关,因此请先将前面四篇教程浏览一次,然后按照例子都写出来。
前面,我们讨论过,创建任务(Task)的话,一共有四种,其中三种是真正有工作内容设定的,最后一种是自定义任务配置。
下面用序号标识这四种方式:
// ①
Task task = new Task(Action action);
// ②
Task task = Task.Factory.StartNew(Action action);
// ③
Task task = Task.Run(Action action);
// ④
TaskCompletionSource<int> task = new TaskCompletionSource<int>();
Task<int> myTask = task.Task; // Task myTask = task.Task;
第一种方法,创建的任务,需要使用 .Start() 方法开始这个任务。
Task.Run() 是 Task.Factory.StartNew() 的简化形式,这两种方式创建的任务会立即执行,然后返回这个任务的 Task 对象。因为任务已经开始,所以不能再使用 .Start() 方法。
Task.WhenAll()、Task.WhenAny() 等方法,不能使用 new Task() 方式创建任务;
第四种是便于任务的封装和流程控制,本身不进行任务工作。用得很少,这里忽略掉。
C# 多线程(17):小总结的更多相关文章
- JAVA多线程17个问题
1.Thread 类中的start() 和 run() 方法有什么区别? Thread.start()方法(native)启动线程,使之进入就绪状态,当cpu分配时间该线程时,由JVM调度执行run( ...
- C# 基础知识系列- 17 小工具优化
0. 前言 不知道有没有动手能力强的小伙伴照着上一篇的内容写过程序呢?如果有的话,应该会在使用的时候发现以下几个问题: 每次启动都需要经过漫长的时间去遍历磁盘里的文件目录 因为数据是用的字典保存的,所 ...
- Java多线程17:中断机制
概述 之前讲解Thread类中方法的时候,interrupt().interrupted().isInterrupted()三个方法没有讲得很清楚,只是提了一下.现在把这三个方法同一放到这里来讲,因为 ...
- C# winform多线程的小例子
在文本框中输入一个数字,点击开始累加按钮,程序计算从1开始累计到该数字的结果.因为该累加过程比较耗时,如果直接在UI线程中进行,那么当前窗口将出现假死.为了有更好的用户体验,程序启动一个新的线程来单独 ...
- IOS多线程的小总结
ios中多线程的实现方案有4种 1.pthread :一套通用的多线程API/适用于Unix\Linux\Windows等系统 (跨平台可移植/使用难度大) C语言 几乎不用 ...
- java多线程17:ThreadLocal源码剖析
ThreadLocal源码剖析 ThreadLocal其实比较简单,因为类里就三个public方法:set(T value).get().remove().先剖析源码清楚地知道ThreadLocal是 ...
- 数据算法 --hadoop/spark数据处理技巧 --(17.小文件问题 18.MapReuce的大容量缓存)
十七.小文件问题 十八.MR的大容量缓存 在MR中使用和读取大容量缓存,(也就是说,可能包括数十亿键值对,而无法放在一个商用服务器的内存中).本次提出的算法通用,可以在任何MR范式中使用.(eg:MR ...
- 4.17 小发现(dalao勿点)
洛谷上: (1)iso::sync_with_stio(0); 虽然可以提高cin的速度; 但是有时会RE或WA(如果是WA一般提示Too shot on line); (2)函数最好写上return ...
- [Xcode 实际操作]八、网络与多线程-(17)使用网址会话对象URLSession向远程服务器上传图片
目录:[Swift]Xcode实际操作 本文将演示如何通过网址会话对象URLSession向远程服务器上传图片. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的代理模 ...
- Visual Studio 2013/15/17小技巧
1.Ctrl + F10 可以直接运行到光标处,而不用F10 逐过程 F11 逐语句了 2.当有多个断点时,按F5可以切换到下一个断点. 3.Ctrl+Shift+空格 显示函数签名,上下键可以查看所 ...
随机推荐
- 你也能成为“黑客”高手——趣谈Linux Shell编程语言
作者:京东零售 杜兴文 我们看过很多在电脑命令行敲一些命令并给观众展示很高科技的画面感的电影,比如<盗梦空间><操作系统革命><代码>等等, 再想想电影黑客帝国中的 ...
- 【小优化】golang中取两个字符串的公共前缀的长度
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 在VM的merge部分的代码中发现这样一个函数: func ...
- 设计模式学习-使用go实现备忘录模式
备忘录模式 定义 优点 缺点 适用范围 代码实现 参考 备忘录模式 定义 备忘录( Memento ):在不破坏封装性的前提下,获取一个对象的内部状态,并在该对象之处保存该状态.这样以后就可将该对象恢 ...
- 开启想象翅膀:轻松实现文本生成模型的创作应用,支持LLaMA、ChatGLM、UDA、GPT2等模型,开箱即用
开启想象翅膀:轻松实现文本生成模型的创作应用,支持LLaMA.ChatGLM.UDA.GPT2等模型,开箱即用 1.介绍 TextGen实现了多种文本生成模型,包括:LLaMA.ChatGLM.UDA ...
- Python实现栈、队列、双端队列
栈的实现 class Stack(): def __init__(self): self.items = [] def push(self, item): self.items.append(item ...
- WebAssembly核心编程[4]: Memory
由于Memory存储的是单纯的二进制字节,所以原则上我们可以用来它作为媒介,在wasm模块和数组程序之间传递任何类型的数据.在JavaScript API中,Memory通过WebAssembly.M ...
- Delphi 字符串截取函数【LeftStr,RightStr,MidStr】
如果要使用LeftStr,RightStr,MidStr必需引用系统单元StrUtils; 声明变量Str:string; Str:=HelloWorld; 1,LeftStr(Str,2)=He;/ ...
- .NET 云原生架构师训练营(模块二 基础巩固 HTTP管道与中间件)--学习笔记
2.3.2 Web API -- HTTP管道与中间件 管道 中间件 ASP.NET Core 中间件:https://docs.microsoft.com/zh-cn/aspnet/core/fun ...
- MySQL的CTE(公用表表达式)
(一)概念 MySQL的CTE是在MySQL8.0版本开始支持的,公用表表达式是一个命名的临时结果集,仅在单个SQL语句(例如select.insert.delete和update)的执行范围内存在. ...
- 通过解析库探究函数式抽象代价 ( ini 解析示例补充)
上一篇 用 HexColor 作为示例,可能过于简单 这里再补充一个 ini 解析的示例 由于实在写不动用其他库解析 ini 了, 春节都要过完了,累了,写不动了, 所以随意找了一份解析ini的库, ...