C#核心知识

委托

如何声明一个委托:通过 【delegate 返回值类型 委托名称】 的格式来定义

如何使用一个委托:使用new关键字,并传入和声明委托的构造相同的方法名,比如:new 委托名称(与委托的参数和返回值相同的一个方法名)

如何调用一个委托:将new关键字返回的实例调用Invoke方法,或者像调用一个方法一样调用它,就像方法一个调用都可以

什么是多播委托:顾名思义,多播委托可以注册多个实现了委托的方法。

如何使用多播委托:通过+=,-=注册,取消注册委托

预定义委托:通过Action,Func来实现,他们的区别在于Action没有返回值,Func有返回值,返回值在最后一个泛型里。

匿名函数经常和委托一起使用,语法:()=>{}

事件

事件是在委托的基础上做的一个安全的处理,避免直接调用委托,而是通过+=,-=这种方式去注册,取消注册委托。并且在内部实现了线程安全的操作。

如果要研究源码可以在SharpLab中看到用原始方法是如何实现了高级语法的。

多线程

什么是线程?

一个进程有多个线程,线程是操作系统中独立运行的最小单位。

为什么要用多线程?

希望能同时运行多个任务,提高效率。

什么是线程池?

是一组预先创建的线程,可以被重复利用来执行任务。

什么是线程安全?

多个线程同时访问共享资源时,对它的访问不会产生数据不一致的后果。

同步机制:用于协调多个线程访问的执行顺序去访问共享资源,避免数据不一致的问题。通过lock(obj){}的方式实现同步。

lock语法糖实际是对Monitor的一个封装。

原子操作:在执行任务时要么全部执行,要么全部不执行,确保了数据的一致性。 通过Interlocked类实现原子操作

并行操作:使用并行操作(PLinq)可以大幅提高效率,使用AsParallel方法可以确保并行操作的执行。

如果前台线程消亡,后台线程也要跟着消亡,Main函数就是一个前台线程。

如何创建一个线程?

new Thread(方法名称).Start(方法的参数)

{

IsBackground = ,

....... // 配置

}

Join方法可以让当前线程先执行完毕,确保后面的线程不会在它之前执行。

Interrupt可以中断线程的执行

信号量(Semaphore):可以理解为高速公路的闸口和车道数,第一个参数控制开启的闸口数,第二个参数控制车道数。

异步编程

异步不意味着多线程,单线程也可以是异步的。异步默认是使用线程池的,可以从线程ID中观察的到,每次的ID都不一样。

多线程适合CPU密集型的操作,适合长期运行的任务

异步适合IO密集型的操作,适合短暂的小任务,例如:服务器的后端接口;异步可以查看到线程执行的状态。

异步任务的创建:

1、Task.Run()

2、Task.Factory.StartNew()

3、new Task().Start();

特性:

1、将方法标记为async后,方可在方法中使用await,还有一种同步的写法但不推荐:InvokeTask().GetAwaiter().GetResult();

2、async+await会将方法包装为状态机

3、异步编程具有传染性

async void这种写法几乎只用于对事件的注册。

常见的阻塞情形:

1、Task.Wait() Task.Result如果任务没有完成,则会阻塞当前线程,容易造成死锁。

2、InvokeTask().GetAwaiter().GetResult(); 依旧是个阻塞写法

3、Thread.Sleep(),使用异步时应该为Task.Delay(),这种写法会立即释放当前线程

4、IO耗时的操作

如何开启多个异步任务?

Task.WhenAll(task),Task.WhenAny(task),不要在for循环中await。

如何取消异步任务?

使用CancellationToken实例的Cancel方法,同时配合IsCancellationRequested属性可以在任务中精确控制是否继续执行任务。

任务超时如何实现?

在创建CancellationTokenSource时传入超时时间,比如:new CancellationTokenSource(2000);

注意事项

需要注意的是每次需要手动释放CancellationTokenSource

??运算符,当左边的参数不为空则返回它,如果为空则返回右边的参数

有哪些同步机制?

SemaphoreSlim 推荐,用法简单

Channel

第三方库 - AsyncLock,比较复杂适用于大型项目

如何在在同步方法中调用异步?

1、应避免使用xxx.Wait(),xxx.Result,有可能导致死锁,且无法捕获异常。

2、应避免使用async void,无法捕获到内部异常,内部不加异常捕获会导致程序挂掉

3、InvokeTask().GetAwaiter().GetResult(); 可以捕获到内部异常。

4、SafeFireForget:async void SafeFireForget(Task task, Action? completed, Action<Exception> expection),第一个参数是异步执行的业务方法,第二个参数是异步任务完成后的回调委托,第三个参数是异步任务出现异常的回调委托

5、ContinueWith:Job().ContinueWith(xxxTask),在异步任务完成后调用它的ContinueWith方法,参数是对任务完成与否的处理方法。

GC

.NET中将引用对象分为三类,第0代,第1代,第2代对象,一般会优先进行第0代回收, 然后将未成功回收的放到第1代中,如果第1代对象再次未回收成功会放到第2代中,这样做可以减少回收的成本,提高效率。

在C#中,析构函数(也称为终结器)主要用于释放非托管资源(如文件句柄、数据库连接、操作系统句柄等)。

class ResourceWrapper
{~ResourceWrapper() // 析构函数{// 释放非托管资源CloseHandle(fileHandle);}
}

重要配置

在项目文件xxx.csproj中修改以下配置

工作站与服务器模式

工作站模式:适合内存占用小的程序和桌面应用,回收频率高,是单线程的。

服务器模式:适合内存占用大的程序,回收频率低,吞吐量高,是多线程的。

1、true - 服务器模式,false - 工作站模式

<ServerGarbageCollection>true</ServerGarbageCollection>

普通GC与后台GC

普通GC:会导致单次停顿时间变长(例如UI线程的卡死),但消耗的资源少,支持压缩处理。

后台GC:单次停顿时间短,但停顿的频率多,消耗的资源多,不支持压缩处理。

2、true - 启动后台GC,false - 普通GC

<ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费LUT网站

FREE LUTs | Color Lookup Tables - Presetpro.com

力扣-160.相交链表

题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返…

架构风格对比

架构风格深度对比&#xff1a;从管道-过滤器到微内核 &#x1f4dc; 引言 在软件架构设计中&#xff0c;不同的架构风格适用于不同的业务场景。本文将深入解析 7种主流架构风格&#xff0c;包括它们的核心思想、优缺点、适用场景&#xff0c;并通过对比表格和示例帮助您选择最…

「Mac畅玩AIGC与多模态05」部署篇03 - 在 Mac 上部署本地向量化模型(Embedding Models)

一、概述 本篇介绍如何在 macOS 环境下,为 Dify 平台部署本地向量化模型(Embedding Models),支持知识库文档向量化、语义检索与智能体上下文增强。向量化模型是实现知识库问答与 RAG(检索增强生成)应用的基础组件。 二、部署流程 1. 环境准备 确认 Docker Desktop 正常…

shell(3)

1.介绍 定义变量的规则 1.变量名称可以由字母,数字和下划线组成,但是不能以数字开头. 5A200() 2.等号两侧不能有空格. 3.变量名称一般习惯为大写,这是一个规范. 2.将命令的返回值只赋给变量 1、A&#xff40;date&#xff40;反引号,运行里面的命令,并把结果返回给变量A. 注&a…

人智交互中的AI世代

人智交互中的AI世代 一、研究背景与意义 1.1 技术演进背景 人工智能技术自1956年达特茅斯会议提出概念以来&#xff0c;经历了多次技术迭代与产业周期。2020年后&#xff0c;以大语言模型&#xff08;LLMs&#xff09;和生成式AI&#xff08;AIGC&#xff09;为代表的突破性进…

4.环境变量

目录 1.并行与并发 2. 环境变量 2.1 举例子 2.2 命令行参数 2.3 环境变量 1.并行与并发 并行&#xff1a;多个进程在多个CPU下分别、同时运行&#xff0c;称为并行 并发&#xff1a;多个进程在一个CPU下采用进程切换的方式&#xff0c;在一时间段内&#xff0c;多个进程同…

Spring Boot 中使用 Feign 调用内网 IP 接口并记录入参与出参

在微服务架构中&#xff0c;服务间的通信是常见的需求。Spring Cloud 提供的 Feign 客户端是一个声明式的 Web 服务客户端&#xff0c;它使得服务间的调用变得非常简单。然而&#xff0c;在实际开发中&#xff0c;我们可能需要调用内网 IP 地址的接口&#xff0c;并且希望记录请…

【Java】 使用 HTTP 响应状态码定义web系统返回码

系统状态码定义 public interface GlobalErrorCodeConstants {ErrorCode SUCCESS new ErrorCode(0, "成功");// 客户端错误段 ErrorCode BAD_REQUEST new ErrorCode(400, "请求参数不正确");ErrorCode UNAUTHORIZED new ErrorCode(401, "账号未登…

如何搭建spark yarn模式的集群

一、基础环境准备 ‌安装JDK 1.8‌ 所有节点需安装JDK并配置环境变量&#xff0c;确保JAVA_HOME正确指向安装路径14。‌部署Hadoop集群‌ 安装Hadoop&#xff08;推荐3.x版本&#xff09;&#xff0c;配置YARN资源管理器4。在yarn-site.xml中启用资源调度&#xff1a; <pro…

python22-元组、列表、字典、集合推导式

课程&#xff1a;B站大学 记录python学习&#xff0c;直到学会基本的爬虫&#xff0c;使用python搭建接口自动化测试就算学会了&#xff0c;在进阶webui自动化&#xff0c;app自动化 循环语句小作业 元组推导式列表推导式字典推导式实践是检验真理的唯一标准 推导式 简介 Pytho…

探索 CameraCtrl模型:视频生成中的精确摄像机控制技术

在当今的视频生成领域&#xff0c;精确控制摄像机轨迹一直是一个具有挑战性的目标。许多现有的模型在处理摄像机姿态时往往忽略了精准控制的重要性&#xff0c;导致生成的视频在摄像机运动方面不够理想。为了解决这一问题&#xff0c;一种名为 CameraCtrl 的创新文本到视频模型…

跨端开发技术总结

1.electron&#xff1a; 基于node.js 桌面端&#xff1a;window / linux / macos 手机端&#xff1a;无 页面&#xff1a;网页开发相关技术都可以 2.tauri 基于rust 桌面端&#xff1a;window / linux / macos 手机端&#xff1a;android / IOS 页面&#xff1a;网页开…

单片机-89C51部分:7、中断

飞书文档https://x509p6c8to.feishu.cn/wiki/A5gcwyL5giq1JOkkcsscn8eLnzf 一、中断的作用 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的&#xff0c;中断功能的存在&#xff0c;很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功…

0805登录_注册_token_用户信息_退出-网络ajax请求2-react-仿低代码平台项目

文章目录 1 JWT1.1 JWT结构1.2 工作流程1.3 优点1.4 缺点1.5 安全实践1.6. 适用场景1.7 JWT与OAuth2**8. 示例代码&#xff08;Node.js&#xff09;** 2 用户mock和api3 注册4 登录5 token存储6 请求拦截器设置token6 获取用户信息7 退出登录结语 1 JWT JSON Web Token&#x…

大模型入门

一、模型入门路径 1. 学习预备知识 编程语言&#xff1a;熟练掌握Python编程语言&#xff0c;包括基本语法、数据结构&#xff08;列表、字典、元组等&#xff09;、面向对象编程、文件操作等。Python有丰富的机器学习和深度学习库&#xff0c;方便进行大模型的开发和实验。数…

把dll模块注入到游戏进程的方法_插APC注入

一、概述 APC是异步过程调用,系统创建线程的时候会为线程创建一个APC队列,当线程调用SleepEx,WaitSingleObjectEx等函数时,并把线程状态被设置为可提醒状态时,线程并不会睡眠,而是检查APC队列是否为空,如果不为空,转去执行APC队列中的每一项,因此给目标进程中的线程插…

git 如何清空当前分支的历史提交记录,仅保留最后一次提交

本方法基于新建 Git 孤立分支实现&#xff1a; 1. ​​首先检出待清理的分支 在 IDEA 右下角检查当前分支名称 或执行 git branch 确认。如果不在目标分支上&#xff0c;会显示 (HEAD detached at xxxxx)&#xff0c;这时需要先切换分支&#xff1a; git checkout 原分支名 2.…

【C++】Googletest应用

Googletest 1 配置 使用cmake配置&#xff1a; 具体文件后面上传补充 ./test.out --gtest_filterXXXTest.xxx 2 gdb 为了跟踪流程&#xff0c;可以使用gdb&#xff1b; gdb ./xxx.out gdb --args ./gtest --gtest_filterxxx.xxx设置运行参数 set args --gtest_filterxxx.…

JavaScript:从DOM概述到window对象的常见事件

一、BOM概述 1.BOM的概念 BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是window 2.BOM的构成 BOM比DOM更大&#xff0c;它包含DOM window对象是浏览器的顶级对象&a…