第 27 章 计算限制的异步操作本章内容:
CLR 线程池基础
执行简单的计算限制操作
执行上下文
协作式取消和超时
任务
Parallel 的静态 For,ForEach 和 Invoke方法
并行语言集成查询(PLINQ)
执行定时的计算限制操作
线程池如何管理线程
27.1 CLR 线程池基础CLR 提供了线程池来管理可用的线程集合。每个CLR都有自己的线程池,但多个CLR之间共享。
基本流程如下:
线程池内部维护一个请求列队,用于缓存用户请求需要执行的代码任务,就是ThreadPool.QueueUserWorkItem提交的请求;
有新任务后,线程池使用空闲线程或新线程来执行队列请求;
任务执行完后线程不会销毁,留着重复使用;线程池自己负责维护线程的创建和销毁,当线程池中有大量闲置的线程时,线程池会自动结束一部分多余的线程来释放资源;
线程池的不足:
线程池内的线程不支持线程的挂起、取消等操作,如想要取消线程里的任务,.NET 支持一种协作式方式取消;
线程内的任务没有返回值,也不知道何时执行完成;
不支持设置线程的优先级,还包括其他类似需要对线程有更多的控制的需求 ...
第 26 章 线程基础本章内容:
Windows 为什么要支持线程
线程开销
停止疯狂
CPU 发展趋势
CLR 线程和 Windows 线程
使用专用线程执行异步的计算限制操作
使用线程的理由
线程调度和优先级
前台线程和后台线程
继续学习
26.2 线程开销每个线程都有以下要素
线程内核对象(thread kernel object)
线程环境块(thread environment block,TEB)TEB 是在用户模式中分配和初始化的内存块。TEB 耗用 1 个内存页。 TEB 包含线程的异常处理链首(head)。线程进入的每个 try 块都在链首插入一个节点(node);线程退出 try 块时从链中删除该节点。
用户模式栈(user-mode stack)用户模式栈存储传给方法的局部变量和实参。Windows 默认为每个线程的用户模式栈分配 1 MB 内存。
内核模式栈(kernel-mode stack)应用程序代码向操作系统中的内核模式函数传递实参时,还会使用内核模式栈。在 32 位 Windows 上运行,内核模式栈大小是 12 KB; 64 位 Wi ...
第 24 章 运行时序列化本章内容
序列化/反序列化快速入门
使类型可序列化
控制序列化和反序列化
格式化器如何序列化类型实例
控制序列化/反序列化的数据
流上下文
将类型序列化为不同的类型以及将对象反序列化为不同的对象
序列化代理
反序列化对象时重写程序集和/或类型
序列化是将对象或对象图转换成字节流的过程。反序列化是将字节流转换回对象图的过程。在对象和字节流之间转换是很有用的机制。下面是一些例子。
24.1 序列化/反序列化快速入门格式化器参考对每个对象的类型进行描述的元数据,从而了解如何序列化完整的对象图。序列化时,Serialize 方法利用反射来查看每个对象的类型中都有哪些实例字段。在这些字段中,任何一个引用了其他对象,格式化器的 Serialize 方法就知道那些对象也要进行序列化。如果对象图中的两个对象相互引用,格式化器会检测到这一点,每个对象都只序列化一次,避免发生死循环。
面是一个有趣而实用的方法,它利用序列化创建对象的深拷贝(或者说克隆体):
123456789101112131415161718192021priva ...
第 23 章 程序集加载和反射本章内容
程序集加载
使用反射构建动态可扩展应用程序
反射的性能
设计支持加载项的应用程序
使用反射发现类型的成员
23.1 程序集加载JIT 编译器将方法的 IL 代码编译成本机代码时,会查看 IL 代码中引用了哪些类型。在运行时,JIT 编译器利用程序集的 TypeRef 和 AssemblyRef 元数据表来确定哪一个程序集定义了所引用的类型。在 AssemblyRef 元数据表的记录项中,包含了构成程序集强名称的各个部分。JIT 编译器尝试将与该标识匹配的程序集加载到 AppDomain 中(如果还没有加载的话)。
CLR 使用 System.Reflection.Assembly 类的静态 Load 方法尝试加载这个程序集。
12345public class Assembly { public static Assembly Load(AssemblyName assemblyRef); public static Assembly Load(String assemblyString); // 未列出不常用的 ...
第 22 章 CLR 寄宿和 AppDomain本章内容:
CLR 寄宿
AppDomain
卸载 AppDomain
监视 AppDomain
AppDomain FirstChance 异常通知
宿主如何使用 AppDomain
高级宿主控制
本章主要讨论寄宿和 AppDomain。寄宿使应用程序能利用CLR功能,并提供自定义和扩展的能力。而AppDomain则允许第三方代码在进程中运行,而CLR确保数据结构、代码和安全上下文不受破坏。
22.1 CLR 寄宿开发 CLR 时,Microsoft 实际是把它实现成包含一个 DLL 中的 COM 服务器。
任何 Windows 应用程序都能寄宿(容纳)CLR。你的非托管宿主应该调用 MetaHost.h 文件中声明的 CLRCreateInstance 函数。CLRCreateInstance 函数在 MSCorEE.dll 文件中实现,这个 DLL 被人们亲切地称为垫片(shim),它的工作是决定创建哪个版本的CLR;垫片 DLL 本身不包含 CLR COM 服务器。
CLRCreateInstance 函数可返回一个 ICLR ...
第 21 章 托管堆和垃圾回收
托管堆基础
代:提升性能
使用需要特殊清理的类型
手动监视和控制对象生存期
21.1 托管堆基础以下是访问一个资源所需的步骤。
调用 IL 执行 newobj,为代表资源的类型分配内存(一般使用 C# new 操作符来完成)。
初始化内存,设置资源的初始状态并使资源可用。类型的实例构造器负责设置初始状态。
访问类型的成员来使用资源(有必要可以重复)。
摧毁资源的状态以进行清理。
释放内存。垃圾回收器独自负责这一步。
为了进一步简化编程,开发人员经常使用的大多数类型都不需要步骤 4。大多数类型都无需资源清理,垃圾回收器会自动释放内存。
调用Dispose方法清理资源可按照自己的节奏清理资源,而不是非要等着GC介入。一般只有包装了本机资源(文件、套接字和数据库连接等) 的类型才需要特殊清理。
21.1.1 从托管堆分配资源C# 的 new 操作符导致 CLR 执行以下步骤。
计算类型的字段(以及从基类型继承的字段)所需的字节数。
加上对象的开销所需的字节数。每个对象都有两个开销字段:类型对象指针和同步块索引。对于 32 位应用程序,这两个 ...
第 20 章 异常和状态管理本章内容
定义“异常”
异常处理机制
System.Exception 类
FCL 定义的异常类
抛出异常
定义自己的异常类
用可靠性换取开发效率
设计规范和最佳实践
未处理的异常
对异常进行调试
异常处理的性能问题
约束执行区域(CER)
代码协定
20.2 异常处理机制以下 C# 代码展示了异常处理机制的标准用法,可通过它对异常处理代码块及其用途产生初步认识。代码后面的各小节将正式描述 try、catch 和 finally 块及其用途,并提供关于它们的一些注意事项。
12345678910111213141516171819202122232425private void SomeMethod() { try { // 需要得体地进行恢复和/或清理的代码放在这里 } catch (InvalidOperationException) { // 从 InvalidOperationException 恢复的代码放在这里 } catch (IOE ...
第 19 章 可空值类型本章内容
C# 对可空值类型的支持
C# 的空接合操作符
C# 对可空值类型的特殊支持
现在,要在代码中使用一个可空的 Int32,就可以像下面这样写:
1234Nullable<Int32> x = 5;Nullable<Int32> y = null;Console.WriteLine("x: HasValue={0}, Value={1}", x.HasValue, x.Value);Console.WriteLine("y: HasValue={0}, Value={1}", y.HasValue, y.GetValueOrDefault());
编译并运行上述代码,将获得以下输出:
12x: HasValue=True, Value=5y: HasValue=False, Value=0
19.1 C#对可空值类型的支持C# 允许用问号表示法来声明并初始化 x 和 y 变量:
12Int32? x = ...
第2章 资源标记与管理资源标记为Addressable手动标记资源将资源标记为Addressable是最基本的操作,有以下几种方式:
方式一:Inspector面板标记
在Project窗口中选择目标资源
在Inspector面板底部找到”Addressable Asset”组件
勾选”Addressable”复选框
系统会自动生成一个默认地址(通常是资源路径)
可以修改Address字段来自定义地址名称
方式二:Addressables Groups窗口标记
打开Window > Asset Management > Addressables > Groups
在Groups窗口中可以看到所有资源
选中需要标记的资源行
在Address列中输入地址名称
或者勾选Address列的复选框使用默认地址
批量标记资源对于大量资源的标记,可以使用以下方法:
使用脚本批量标记1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545 ...
第1章 Addressables概述与环境搭建什么是Addressables系统Unity Addressables系统是Unity提供的一种高级资源管理解决方案,它允许开发者以地址(Address)的方式引用和加载资源,而不是直接引用资源对象。Addressables系统建立在AssetBundle之上,提供了更高级别的抽象和更灵活的资源管理方式。
Addressables系统的核心思想是将资源与其位置解耦,开发者可以通过一个地址字符串来获取资源,而不需要关心资源具体存储在本地还是远程服务器上。这种设计使得资源管理更加灵活,支持本地资源、远程资源、打包资源和非打包资源的统一管理。
Addressables系统的主要特点包括:
统一的资源加载API
支持本地和远程资源
自动处理依赖关系
内置缓存管理
支持内容更新
灵活的分组策略
为什么需要Addressables(vs传统Resources/AssetBundle)传统Resources系统的局限性传统的Resources文件夹方式虽然简单易用,但存在以下严重问题:
打包体积过大:所有Resources文件夹中的资源都 ...










