前言

本篇内容是小总结和过渡,看完这篇后,就要开始继续学习 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.Run() 和 Task.Factory.StartNew() 内部做了不少封装;

Task.WhenAll()、Task.WhenAny() 等方法,不能使用 new Task() 方式创建任务;

第四种是便于任务的封装和流程控制,本身不进行任务工作。用得很少,这里忽略掉。

C# 多线程(17):小总结的更多相关文章

  1. JAVA多线程17个问题

    1.Thread 类中的start() 和 run() 方法有什么区别? Thread.start()方法(native)启动线程,使之进入就绪状态,当cpu分配时间该线程时,由JVM调度执行run( ...

  2. C# 基础知识系列- 17 小工具优化

    0. 前言 不知道有没有动手能力强的小伙伴照着上一篇的内容写过程序呢?如果有的话,应该会在使用的时候发现以下几个问题: 每次启动都需要经过漫长的时间去遍历磁盘里的文件目录 因为数据是用的字典保存的,所 ...

  3. Java多线程17:中断机制

    概述 之前讲解Thread类中方法的时候,interrupt().interrupted().isInterrupted()三个方法没有讲得很清楚,只是提了一下.现在把这三个方法同一放到这里来讲,因为 ...

  4. C# winform多线程的小例子

    在文本框中输入一个数字,点击开始累加按钮,程序计算从1开始累计到该数字的结果.因为该累加过程比较耗时,如果直接在UI线程中进行,那么当前窗口将出现假死.为了有更好的用户体验,程序启动一个新的线程来单独 ...

  5. IOS多线程的小总结

    ios中多线程的实现方案有4种    1.pthread :一套通用的多线程API/适用于Unix\Linux\Windows等系统 (跨平台可移植/使用难度大)    C语言    几乎不用     ...

  6. java多线程17:ThreadLocal源码剖析

    ThreadLocal源码剖析 ThreadLocal其实比较简单,因为类里就三个public方法:set(T value).get().remove().先剖析源码清楚地知道ThreadLocal是 ...

  7. 数据算法 --hadoop/spark数据处理技巧 --(17.小文件问题 18.MapReuce的大容量缓存)

    十七.小文件问题 十八.MR的大容量缓存 在MR中使用和读取大容量缓存,(也就是说,可能包括数十亿键值对,而无法放在一个商用服务器的内存中).本次提出的算法通用,可以在任何MR范式中使用.(eg:MR ...

  8. 4.17 小发现(dalao勿点)

    洛谷上: (1)iso::sync_with_stio(0); 虽然可以提高cin的速度; 但是有时会RE或WA(如果是WA一般提示Too shot on line); (2)函数最好写上return ...

  9. [Xcode 实际操作]八、网络与多线程-(17)使用网址会话对象URLSession向远程服务器上传图片

    目录:[Swift]Xcode实际操作 本文将演示如何通过网址会话对象URLSession向远程服务器上传图片. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的代理模 ...

  10. Visual Studio 2013/15/17小技巧

    1.Ctrl + F10 可以直接运行到光标处,而不用F10 逐过程 F11 逐语句了 2.当有多个断点时,按F5可以切换到下一个断点. 3.Ctrl+Shift+空格 显示函数签名,上下键可以查看所 ...

随机推荐

  1. 仅杀掉当前目录的java进程的办法

    比较简单,比如当前目录名字是 /su 就可以写成如下: 利用 /proc/ 下面的cwd 来进行判断直接杀进程 尽量路径唯一标识符 进行处理. for i in `ps -ef |grep java ...

  2. Ant Design Vue中TreeSelect详解

    <template> <a-tree-select v-model:value="value" style="width: 320px" :t ...

  3. 文件上传change事件只执行一次的问题

    参考地址:https://blog.csdn.net/john_xiaoweige/article/details/81392110 本节中的注意点: this.$refs.attenceInput. ...

  4. 自动部署(apb docker cicd gitlab)

    1.安装gitlab-runner docker pull gitlab/gitlab-runner:latest 2.运行镜像 docker run -d --name gitlab-runner ...

  5. druid和druid-spring-boot-starter区别,以及springboot项目中提示报错Cannot resolve configuration property 'spring.datasource.xxxx' 和hikari配置属性

    一.druid和druid-spring-boot-starter区别分析 作用是一样的,都是连接池提供连接,里边的配置参数都是一样的: druid-spring-boot-starter只是在dru ...

  6. 小白学k8s(12)-k8s中PV和PVC理解

    pv和pvc 什么是pv和PVC 生命周期 PV创建的流程 1.创建一个远程块存储,相当于创建了一个磁盘,称为Attach 2.将这个磁盘设备挂载到宿主机的挂载点,称为Mount 3.绑定 持久化卷声 ...

  7. Python 实现Web容器指纹识别

    当今的Web安全行业在进行渗透测试时普遍第一步就是去识别目标网站的指纹,从而进一步根据目标框架进行针对性的安全测试,指纹识别的原理其实很简单,目前主流的识别方式有下面这几种. 1.识别特定网页中的关键 ...

  8. spark读取空orc文件时报错java.lang.RuntimeException: serious problem at OrcInputFormat.generateSplitsInfo

    问题复现: G:\bigdata\spark-2.3.3-bin-hadoop2.7\bin>spark-shell 2020-12-26 10:20:48 WARN NativeCodeLoa ...

  9. 12个例子夯实promise基础

    工作中常常用到promise,async + await,遇到一些问题需要用到基础知识总会有一部分不记得,就重新温习权威指南和es6标准入门,花了几天肝下了这篇文章.喜欢的同学请动动发财手点个赞,文章 ...

  10. Nginx的反向代理做负载均衡

    对于一个大型网站,随着网站的访问量快速增长,单台服务器很难再支撑起需要,所以我们会购置多个服务器来满足业务量的需求,然后再利用Nginx提供的反向代理功能,来实现多台服务器间的协作功能,提高网站的处理 ...