[db:标题]
摘要:课程:【.NET 6教程,.Net Core 2022视频教程,杨中科主讲】 https:www.bilibili.comvideoBV1pK41137He?p=159&share_source=copy_
课程:【.NET 6教程,.Net Core 2022视频教程,杨中科主讲】 https://www.bilibili.com/video/BV1pK41137He/?p=159&share_source=copy_web&vd_source=d944df449598b7e51bbc29cddb033275
一:.net core 初识
asp.net core 与传统asp.net form相比,更轻量级,运行速度更快,不与iis耦合,能跨平台。
传统的.netframework依赖 framework运行库,而这种传统的运行库,是系统级的,操作系统上所有依赖与这个运行库的软件都受到这个运行库影响,会出现软件的兼容冲突问题,而.net core 能独立部署,同一台操作系统上的不同.net core程序独立部署就不会相互影响,这种方式更能符合现如今的趋势。
.net standard是一种实现标准,规范,在.net core 运行时库里这种库是没有具体的实现代码,在不同的操作系统下,是由不同的代码逻辑去构造.net core的实现,比如传统的与.net core的实现是由不同路径下的dll实现的,并且用反编译软件查看其代码,发现实现代码是有差异的;而我们在写自己的 standard库时,及非.net系统standard库时,这个standard是有具体实现代码的。
从standard2.1开始,不在支持传统的.net framework了。standard1.0支持.net framework4.5。
.net core程序的发布可以独立发布和依赖发布,独立是不需要安装运行时的,而依赖是需要安装.net core运行时的。
NuGet是一种组件包安装工具,管理组件的依赖关系,能对组件进行升级和降级卸载等操作,帮助开发者更高效的复用组件,提高了开发效率。
.net官方网站:dotnet.microsoft.com
二:异步编程
异步编程,不等同于多线程,它内部的实现是一种switch的状态机,不会加快程序的运行速度。我的理解是,异步在于,服务与当前执行的代码的线程遇到了task时,就不会等待这个task任务执行完毕,顺序执行下去,而是如果这个task耗时稍微长一段时间,那么之前的线程会被线程池调去做其他任务,等await结束后,线程池会再叫一个线程服务当前执行的代码,这个服务线程就是系统执行代码的线程了,不是我们自己建立的线程。
举个例子来说,当在winform中,使用task await执行耗时任务时,是不会阻塞ui线程的执行的,我觉得是ui线程在遇到task时,就不会继续等待这个任务执行了,而是会准备响应ui的其他事件的触发,比如拖动,点击界面这些事件。
在asp.net core中,web服务器里与web程序的交互中,当web程序里有异步时,web服务器的服务线程不会因为web程序执行耗时操作,而在那儿等待,它会处于活动状态,接收web程序新的操作,这样的好处是,同样的web服务器支持的最大并发数,但是异步会提高这个并发的性能。
在异步中,不要用sleep,而是用task.dely(),sleep是阻止服务线程的执行,就会减少并发,而task.dely才是阻止当前任务的执行,不会阻塞服务与代码的线程。
CancellationToken可以提前终止异步任务的执行。
async 关键字,会把方法编译成状态机的语句,这样会降低执行效率,所以当task不需要awiat操作的时候,就不要加async关键字。
当异步遇到yield时,需要用 IAsyncIEnumerable 关键字,yieid关键字也会把代码转为状态机模式。
三、LinqToObject和委托事件
linq 内部使用方法委托,完成对集合的操作。委托是把方法当成变量进行传递,一些回调函数也就是使用的方法委托。委托可用系统提供的Actoin和Func来简化代码。委托使用的地方非常的多。事件利用了委托,事件包含事件源(发布者,触发事件的源头)和订阅者(响应事件的具体方法),事件相当于是观察者模式,能对代码进行解耦,事件用得非常得多。事件可以让类或者对象通知订阅了事件的其他对象和类。事件可以注册也可以取消订阅。
四、控制反转与依赖注入
控制反转的意思,是把创建对象的主动权交给容器。其目的是解耦,让开发者只需在需要时,注入对象,而不需要自己去创建。依赖注入(Dependency Injection,DI)是实现控制反转的其中一种方式,还有一种是服务定位器(ServiceLocator)。服务定位器需要自己通过代码去获取对象,而DI直接可以在构造函数声明形参,然后再构造函数内部赋值成员变量就行了,他们的前提是在容器内注入了对象。
