- .Net Standard 是个标准,规范(定义了一系列必要的方法,但他不提供实现)
- .Net Core 他是在.Net Standard基础上增加了实现以及一些特有方法,他是跨平台高性能的
- .Net Framework 也是在.Net Standard基础上增加了实现以及一些特有方法,但仅可以运行在windows系统中或使用mono运行在linux中
- .NetCore与.NetFramework实现.Net Standard中的同一方法,他是内部实现可能是不同的
- 如果我选择写一个.NetCore与.NetFramework公用的类库,则采用.Net Standard来编写公共类库
- 异步不等于多线程,异步不会提升单个任务的处理速度,他只是提高了处理的并发量,也不会自动放到新的线程中去执行,除非手动(使用await Task.Run)
- 异步涉及线程切换,完全由线程池调度,在await调用的等待期间,可能会把当前线程返还给线程池,调用完毕之后,会重新取一个线程来执行后续代码(这个线程可能是之前的线程也可能是新的),线程切换会导致一些资源切换,性能不一定好
- 异步会将代码中的局部变量封装到一个类中作为成员变量。并且会在next方法中通过switch case来执行(状态机模式),所以他会多生成一个类,运行效率肯定没有普通方法高,可能也会占用很多线程
- 优化:如果在当前方法A内,如果只是转发异步方法B的返回值,不需要拿到这个异步方法B的值去做处理,则可以直接返回异步方法B的Task<>,而不用将A方法async,也不用await B
- 异步方法中暂停,不要使用Thread.Sleep(),使用await Task.Delay();
- 委托就是可以指向方法的类型,可以将方法作为参数传递,一般都用无返回Action<>(),有返回Func<>()
- 委托也可以指向匿名方法,匿名方法可以写成lambda表达式
- 依赖注入简化模块的组装过程,降低模块之间的耦合度。更利于单元测试
- 控制反转,他不需要创建需要的对象,也不关心这个对象,他只需要知道他需要什么对象。两种实现方式:服务定位器,依赖注入。
- 不要再长生命周期的对象中引用比他短生命周期的对象。
- IQueryable相当于把查询翻译成SQL语句,对数据库服务器端进行筛选查询。IEnumerable是对内存中数据进行筛选查询。
- 可以讲两个不同事务合并成一个事务
- TransactionScope可以讲不通操作合并到一个事务,例如文件读写与数据库操作两个不同的操作
- 可以与IAsyncActionFilter结合使用,将不同Action过滤器合并到一个事务里面
自动找到并且释放不再使用的内存空间机制,称为垃圾回收机制,Garbage Collection简称GC
每个线程都有独立栈空间,用于保存调用函数的数据
堆空间就是程序中一块独立的空间,堆空间分配的数据可以被程序中所有函数和线程访问,并且不回随函数返回与线程结束而释放 例如使用new关键字时,就是在分配堆空间
- 值类型的对象本身存储值,引用类型的对象本身存储内存地址,他的值存储在内存地址指向的空间中
- 引用类型的地址存储在栈空间,值存储在堆空间
- 值类型的对象会根据定义的位置隐式分配与释放
- GC回收的是堆空间中不在使用的数据(栈中没有地址指向他们的),栈空间是跟随函数释放而释放
- GC主流方式“标记并清除”,根对象包括:各个线程栈空间上的变量,全局变量,GC句柄,析构队列中的对象
- 静态类中的静态对象是在程序结束的时候去回收
- 应用类型的对象分三代,0代,1代,2代。小对象在0代,大对象在2代。一轮GC后,0代对象如果还存活,他会升级到1代,如果继续存活,升级到2代,会停留在2代
- 反复指向分配与回收造成,会导致产生很多空余空间,这些空余的空间称为碎片空间。压缩机制,可以将碎片空间合并到一起,可以让堆可以分配更大对象。需要修改栈空间与堆空间
- 根据引用类型的对象值的占用空间来区分是大对象(大于等于85000字节),小对象。大对象与小对象分配的堆区域不同。应为他们处理大堆小堆时间不一样,移动大对象成本很高,压缩机制默认只在小对象堆中启用
- 固定对象:引用类型传递给非托管代码必须创建固定类型的GC句柄,并且保持这个句柄存活到非托管代码调用结束。创建了固定类型GC句柄的对象就称为固定对象
- 析构函数:如果对象不在存活,但定义了析构函数,那么对象会添加到析构队列中,并标记存活,GC本轮就不回回收这个对象。但GC结束后会执行析构函数,然后在下一轮GC被回收掉。一般在非托管类型中定义这个
- STW:让GC处理以外的线程全部停止
- 工作站模式与服务器模式:工作站模式:内存占用小和桌面程序,提供更短相应时间。服务器模式:内存占用大,服务程序,提高大吞吐量。
- 普通GC:会导致更长的STW时间,但消耗资源比较小,支持压缩处理。 后台GC:每次STW时间会短一点,但次数和消耗会增多,并且不支持压缩处理。