C#-CLR note - 26线程
开篇 async/wait的使用
static async Task Main(string[] args)
{
Console.WriteLine("start-- ");
var task = Do();
task.Wait();
Console.WriteLine("end-- "+task.Result);
Console.ReadLine();
}
static async Task<string> Do()
{
await Task.Run(() =>
{
//The same to `Task.Delay().Wait();`
//Thread.Sleep(3000);
Task.Delay(2000).Wait();
Console.WriteLine("2000ms later.");
});
Console.WriteLine("Do end.");
return "ok";
}
【但是!!! Unity中以下卡死--访问了t】

【原因】方法ExecuteAsyn方法要开一个线程执行。因为Start方法访问t,一直等待异步方法的返回所以卡住.且对线程断点会卡死
https://zhuanlan.zhihu.com/p/86168785
26.2 线程开销
内存占用
线程内核对象
拥有线程描述属性与线程上下文,线程上下文占用的内存空间为 x86 架构 占用 700 字节、x64 架构 1240 字节 、ARM 架构 350 字节。线程环境块(TEB)
TEB 消耗一个内存页,占用 4KB内存。用户模式栈。
用户模式栈存储传递给方法的局部变量与实参,并且还存储有一个地址用于当前方法返回的时候,线程应该从哪个地方继续执行。默认 Windows 分配保留 1MB 内存。内核模式栈。
32 位 Windows 占用 12 KB,64 位 Windows 占用 24 KB。DLL 线程连接与线程分离通知。
上下文切换
任何时刻一个线程只分配一个CPU,只能运行一个“时间片”(也称“量”“量程”)的长度。时间片到期,就上下文切换到另一个线程。每次操作都有以下操作:
- 将 CPU 寄存器值存储在当前正在运行的线程的内核对象内部的上下文结构之中。
- 从先有线程集合选取一个线程供调度,如果该线程属于另一个进程,还得切换 CPU 能够操作的虚拟地址空间。
- 将上下文结构中的值加载到 CPU 寄存器之中。
26.8 线程调度和优先级
Windows是抢占式多线程操作系统。
线程可在任何时间被停止
不能确保线程在什么时候执行
线程的优先级0-31 (低到高)
//阻止调用线程,直到由该实例表示的线程终止。 thread.Join();
27.5 任务
- ThreadPool的QueueUserWorkItem这个技术有限制,不要用(不知道操作什么时候完成)。
总结
- 创建和销毁线程是昂贵的操作,如果从性能考虑:多少个cpu就多少个线程(因为上下文切换很耗; 另外,创建一个线程需要几秒的时间)
- 多线程的使用导致占用较多内存
- 因为windows侧重响应能力和多线程能力,牺牲开销来创建多线程()
- 线程执行完后,回收到线程池里。(线程池闲一定的时间之后销毁里边的线程)
使用async/await的原因
- Unity的Coroutine不好处理异常、堆栈信息不友好、只能返回IEnumerator不利于同步异步逻辑之间信息的交换。
C#-CLR note - 26线程的更多相关文章
- 线程系列06,通过CLR代码查看线程池及其线程
在"线程系列04,传递数据给线程,线程命名,线程异常处理,线程池"中,我们已经知道,每个进程都有一个线程池.可以通过TPL,ThreadPool.QueueUserWorkItem ...
- 《CLR Via C#》读书笔记:26.线程基础
一.线程开销 操作系统创建线程是有代价的,其主要开销在下面列举出来了. 内存开销 线程内核对象 拥有线程描述属性与线程上下文,线程上下文占用的内存空间为 x86 架构 占用 700 字节.x64 架构 ...
- CLR via C# 读书笔记-26.线程基础
前言 这俩个月没怎么写文章做记录分享,一直在忙项目上线的事情,但是学习这件事情,停下来就感觉难受,clr线程这章也是反复看了好多遍,书读百遍其义自见,今天我们来聊下线程基础 1.进程是什么,以及线程起 ...
- 读书笔记—CLR via C#线程27章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- CLR via C# 线程基础知识读书笔记
1.线程的开销 a.线程内核对象 b.线程环境块 c.用户模式栈(1MB) d.内核模式栈 f.DLL线程连接和线程分离通知 2.线程的优先级由进程优先级和线程优先级共同组成 3.进程中所有的前台线程 ...
- 读书笔记—CLR via C#线程25-26章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- java基础26 线程的通讯;wait()、notify()、notifyAll()等方法
线程的通讯:一个线程完成了自己的任务时,要通知另一个线程去完成另一个任务 1.1.方法 wait():等待.如果线程执行到了wait()方法,那么该线程会进入等待状态,等待状态下的线程必须要被其他线程 ...
- [CLR via C#]25. 线程基础
一.Windows为什么要支持线程 Microsoft设计OS内核时,他们决定在一个进程(process)中运行应用程序的每个实例.进程不过是应用程序的一个实例要使用的资源的一个集合.每个进程都赋予了 ...
- 线程机制、CLR线程池以及应用程序域
最近在总结多线程.CLR线程池以及TPL编程实践,重读一遍CLR via C#,比刚上班的时候收获还是很大的.还得要多读书,读好书,同时要多总结,多实践,把技术研究透,使用好. 话不多说,直接上博文吧 ...
随机推荐
- CollectionView的cell长按事件实现
原生cell没有长按事件,我们需要使用手势识别来绑定CollectionView.创建并绑定CollectionView如下: (void)viewDidLoad { [super viewDidLo ...
- FR6安装问题备注
好久以前偶尔用用FR,采用安装执行文件的方式(5.3版安装没问题).及其编译包的方式都没有问题,最近在6.x提示如下(fr6_5_11_all_ent等),不知是系统原因还是文件问题,未解: ---- ...
- TensorFlow从0到1之程序结构(5)
TensorFlow 与其他编程语言非常不同. 首先通过将程序分为两个独立的部分,构建任何拟创建神经网络的蓝图,包括计算图的定义及其执行.起初这对于传统程序员来说看起来很麻烦,但是正是图定义和执行的分 ...
- (四)Maven项目工程目录约定
使用maven创建的工程我们称它为maven工程,maven工程具有一定的目录规范,如下: src/main/java 存放项目的.java文件 src/main/resources 存放项目资源文件 ...
- Android学习笔记尺寸资源
尺寸资源语法 dp:设备独立资源像素 会根据设备匹配大小 一般用于设置边距和组件大小 sp : 可伸缩像素 根据用户手机字体大小首选项进行缩放 使用尺寸资源 定义尺寸资源 dimens <?xm ...
- Web测试和app测试区别?
EB测试和APP测试从流程上来说,没有区别.都需要经历测试计划方案,用例设计,测试执行,缺陷管理,测试报告等相关活动.从技术上来说,WEB测试和APP测试其测试类型也基本相似,都需要进行功能测试,性能 ...
- ASP.NET WebAPI框架解析第一篇
ASP.NET WebAPI有两种寄宿模式,一种是WebHost,一种是SelfHost,为什么可以有两种模式的原因在于WebAPI有一个相对独立的消息处理管道,只要给这个消息管道传递一个封装好的对象 ...
- 为什么用抓包工具看HTTPS包是明文的
测试或者开发调试的过程中,经常会进行抓包分析,并且装上抓包工具的证书就能抓取 HTTPS 的数据包并显示.由此就产生了一个疑问,为什么抓包工具装上证书后就能抓到 HTTPS 的包并显示呢?不是说 HT ...
- 黎活明8天快速掌握android视频教程--14_把文件存放在SDCard
把文件保存在手机的内部存储空间中 1 首先必须在清单文件中添加权限 <?xml version="1.0" encoding="utf-8"?> & ...
- 宝贝,来,满足你,二哥告诉你学 Java 应该买什么书?
(这次的标题是不是有点皮,对模仿好朋友 guide 哥的,我也要皮一皮) 高尔基说过,对吧?宝贝们,"书籍是人类进步的阶梯",不管学什么,买几本心仪的书读一读,帮助还是非常大的.尽 ...