C#
文章平均质量分 81
盈梓的博客
2020毕业于浙江大学计算机科学与技术系,目前就职于电信公司,负责带领一个小团队进行系统开发,对软件开发具有浓厚的兴趣,工作之余喜欢钻研技术,关注IT技术的发展趋势,发布一些小的毕业设计项目,感谢大家的关注与支持。
展开
-
.NET的AsyncLocal用法指南
通过 AsyncLocal 我们可以在一个逻辑上下文中维护一份私有数据,该上下文后续代码中都可以访问和修改这份数据,但另一个无关的上下文是无法访问的。无论是在新创建的 Task 中还是 await 关键词之后,我们都能够访问前面设置的 AsyncLocal 的数据。原创 2023-06-19 19:46:49 · 1395 阅读 · 0 评论 -
C#程序的内存映射文件解析
Image 虽然是一个快捷的观察内存文件映射方式,那如果自己能实现一个就更有意思了,比如下面对1.txt进行文件映射,在 C# 中有一个快捷类//1kcapaticy,Console.WriteLine("请输入你要写入的内容: ");接下来用 windbg 附加一下,观察 1.txt 是不是被 MappedFile 上了,同时做的修改有没有更新到物理磁盘上。0:006>!原创 2023-06-15 19:41:19 · 1194 阅读 · 0 评论 -
【无标题】
在互联网设计架构过程中,日志异步落库,俨然已经是高并发环节中不可缺少的一环。为什么说是高并发环节中不可缺少的呢?原因在于,如果直接用mq进行日志落库的时候,低并发下,生产端生产数据,然后由消费端异步落库,是没有什么问题的,而且性能也都是异常的好,估计tp99应该都在1ms以内。但是一旦并发增长起来,慢慢的你就发现生产端的tp99一直在增长,从1ms,变为2ms,4ms,直至send timeout。原创 2023-03-11 08:10:30 · 277 阅读 · 0 评论 -
C#编程中最容易出错的7种编写习惯!
对象的处理和使用一样重要,理想的办法是在类中实现IDisposable接口的dispose方法,在使用这个类的对象后,可以通过调用dispose方法进行处理。大部分开发人员更喜欢使用for循环,而无视foreach循环,因为for更容易使用,但操作大型数据集时,使用foreach无疑是最快的,在上面的方法中,连接处理在最后一个代码块中被明确调用,如果发生一个异常,catch代码块就会执行,然后再执行最后一个代码块处理连接,所以,我也要根据实际请求选择使用而不是一直使用某一种。原创 2023-03-01 18:37:29 · 442 阅读 · 0 评论 -
如何在Net6.0里配置多版本支持并支持注释说明的Swagger
现在已经进入了微服务的开发时代了,在这个时代,如果有人问你什么是微服务,你说不知道,就有点太丢人了,别人会有异样的眼光看你,俗话说:唾液淹死人。没办法,我们只能去学习新的东西。但是我们今天不讲WebAPI是什么,如何开发API,以及如何开发Restfull风格的API,我们聊另外一个话题,如何配置Swagger,让其支持多版本,并且支持参数、方法的注释说明。为什么我们会说这呢,因为,我们要开发API,就会涉及到别人如何使用你的API,相应的使用文档就少不了,当时当我们有了Swagger,就不一样了。原创 2023-02-23 16:35:26 · 1128 阅读 · 1 评论 -
.NET7的AOT的使用
笔者注:虽然现在看起来 AOT 的文件很小了,但是如果使用到 HttpClient、System.Text.Json 等库,哪怕只用到了一两个函数,最终包含这些库以及这些库使用到的依赖,生成的 AOT 文件会大得惊人。需要注意的是,裁剪是没有那么简单的,里面配置繁多,有一些选项不能同时使用,每个选项又能带来什么样的效果,这些选项可能会让开发者用得很迷茫。这一部分的代码示例,是从笔者的一个开源项目中抽取出来的,这个项目封装了一些获取系统资源的接口,以及快速接入 Prometheus 监控。原创 2023-02-19 19:57:20 · 4448 阅读 · 0 评论 -
C#的委托原理刨析and事件原理刨析和两者的比较
抽象的 Delegate 类提供用于松散耦合和调用的基础结构,但是这样看来,引发一个问题,无论何时需要不同的方法参数,这都会创建新的委托类型。现在大家是不是对委托有了一定的理解了,而委托涉及到的捕获变量和参数变量,生命周期就说得通了,也知道为啥委托改变了变量,能通知到原本的变量,因为对变量就行了类的装箱,打包成了一个一个引用类型,那方法外部当然知道变量的值被改变了,因为大家都是拿着引用对象的地址呀。大家发现没,最终的IL代码一模一样。简单的理解,委托是方法的抽象类,它定义了方法的类型,可以实例化。原创 2023-02-18 12:22:51 · 870 阅读 · 0 评论 -
.Net Core中使用NEST简单操作Elasticsearch
索引结构字段映射一但创建就无法修改,可以通过新建索引然后转移数据的方式修改索引结构,但是可以往里面新增字段映射,比如修改了实体结构新的字段将会被映射。,如果id相同执行插入操作则为更新不会重复插入。也可以在向索引插入数据的时候自动判断是否存在索引,不存在会自动创建。更新单条数据以下代码等价,可以更新部分字段值,但是。的索引文档唯一值,或者可以通过手动指定如。方法进行匹配删除,下面两种方式等价,删除。如果是单机连接如下代码,可以直接在。删除指定单条数据需要知道数据的。进行更新外还有以下的主动更新。原创 2023-02-18 12:07:55 · 1225 阅读 · 0 评论 -
C#网络爬虫开发
之前做onecat项目的时候,最开始的数据采集模块,就是用 C# 做的,同时还集成了 Chloe 作为 ORM,用 Nancy 做 HTTP 接口,结合 C# 强大的并发功能,做出来的效果不错。网络请求直接使用 .Net Core 标准库的 HttpClient,这个库要求使用单例,在 AspNetCore 里一般用依赖注入,不过这次简单的爬虫直接用 Console 程序就行。我要说但是,动态语言也有其局限性,笔者作为老爬虫带师,几乎各种语言都搞过,现在这个任务并不复杂,用我最喜欢的C#做小菜一碟~原创 2023-02-13 11:03:38 · 1029 阅读 · 0 评论 -
.Net Core对于`RabbitMQ`封装分布式事件总线
EventsBusAttribute.cs:用于Eto(Eto 是我们按照约定使用的Event Transfer Objects(事件传输对象)的后缀. s虽然这不是必需的,但我们发现识别这样的事件类很有用(就像应用层上的DTO 一样))的名称,对应到RabbitMQ的通道。创建项目完成以后分别创建EventsBusOptions.cs,IEventsBusHandle.cs,RabbitMQEventsManage.cs,ILoadEventBus.cs ,提供我们的分布式事件基本接口定义。原创 2023-02-12 16:28:49 · 949 阅读 · 0 评论 -
Docker不做虚拟化内核,对.NET有什么影响?
先创建新数组,把旧数据写到新数组中(此时需要重新根据key计算Hash,因为数据长度变化了,影响计算结果了),在用新数据替换掉原来的旧数组。key值hash后的索引处有元素,说明产生Hash碰撞,需要在链表中结尾处挂载节点,如果在遍历链表的过程中,发现了同key的数据,则执行覆盖即可,不再继续往下遍历去挂载新节点。Java很多方法会跟CPU的核数有关,这个时候调用系统函数,读到的是宿主机信息,而不是我们限制资源的大小。key值hash后的索引处没有元素,需要创建链表头节点,放到该位置的数组空间里。原创 2023-02-11 13:44:11 · 774 阅读 · 0 评论 -
关于C#中async/await的用法
1.首先,async/await 成对出现才有意义。其意义在于可以等待异步操作完成后继续顺序执行,而不是异步操作还没处理完成主线程就进行了下一步。假设,我们现在要模拟简单的下载场景,首先用户点击下载,那么就调用DownloadHandle方法(异步)进行下载,然后通知用户下载完成。其使用的区别如下:(1)使用的情况:staticvoidMain(////// 正常使用async/await时,符合正常的业务逻辑:/// 1. 通知用户下载开始/// 2. 异步下载。转载 2023-02-10 17:33:15 · 1305 阅读 · 0 评论 -
.Net 7 高端玩法,自定义一个CLR运行时
你可以通过这个小型的CLR运行时,构建自己的定制型的运行时。可以看到这个github路径下,是一个hostfxr.h的标准C头文件。在这个目录下面是你的当前电脑安装的.Net 版本了。路径分为,主机路径Host_path也就是你需要运行程序的Debug路径,比如本例的。注意以上 .Net运行时和.Net程序的概念。.Net运行时版本是7.0.0,控制台的.Net版本是6.0.8。假设你的电脑已经安装了.Net,并且运行正常。这个路径下面有一个hostfxr.dll文件,记住它,后面要用。原创 2023-02-05 10:16:31 · 414 阅读 · 0 评论 -
.Net 7 托管Main入口的四种写法(茴香豆?)
同时也要注意的是,它这个Main的参数不能超过一个,要么0个,要么1个。这个规则也是CLR定义的。看到,CLR定义托管Main入口的返回值两种类型:void和unsigned(int)。第一种:最常见的,也是VS默认的,返回值void,带一个参数。按照CLR的规则,C#托管Main入口其实有四种写法。把这些规则两两组合,就成了托管Main入口的所有种类。通过CLR的这些规则,控制C#代码的运作。第二种:返回值void,不带参数。第三种:返回值int,带一个参数。第四种:返回值Int,不带参数。原创 2023-02-04 15:29:06 · 230 阅读 · 0 评论 -
C# 10 Lambda 语法的改进
在不声明委托类型的变量的情况下,这些改进使得人们可以更容易使用 Lambda 表达式,并且它们可以与新的.net Core 最小 API 更无缝地工作。使用时机:某些API会去判断传入的委托方法是否应用了某些特性而有不同的行为,此时便可使用C# 10新增的lambda特性语法来撰写匿名方法,而不用像以前那样非得撰写具名方法不可。当你的程序有很复杂的嵌套lambda语句,便可使用这种明确声明返回类型的方式来减轻编译器推断类型的负担,从而加快编译速度。为fn3的匿名方法、参数、返回类型都加上说明文字。原创 2023-02-03 10:32:44 · 144 阅读 · 0 评论 -
C# 托管堆 遭破坏 问题溯源分析
年前遇到了好几例托管堆被损坏的案例,有些运气好一些,从被破坏的托管堆内存现场能观测出大概是什么问题,但更多的情况下是无法做出准确判断的,原因就在于生成的dump是第二现场,借用之前文章的一张图,大家可以理解一下。这样就算配置好了,当程序在 PInvoke 时,CLR 会读取注册表的 MDA 值,如果开启的话就会读取 config 中 gcUnmanagedToManaged 子节做相应的逻辑。是第二现场,如果是前者目的就达到了。这里使用注册表的方式,需要注意的是,程序和操作系统位数一致的话采用如下方式。原创 2023-02-02 08:56:02 · 190 阅读 · 0 评论 -
C#高性能数组拷贝实验
C#中的byte占8bit,刚好是一个byte,所以直接用元素个数就行,如果是其他类型的数组,得根据类型长度计算字节数,然后再传进去。接着定义几个数组,这里写了五组一维数组,每个不同的数组拷贝方法测试用不同的数组,这样可以避免CPU缓存。,只是用来定义一个比较大的数,现在的电脑性能太强了,小一点的数组复制起来太快了,看不出区别。前两个参数是指针类型,后俩个是长度,注意是bytes字节数,不是数组的元素个数。来记录执行时间,后面的其他拷贝方法里面也有,等会用这个计算出来的。原创 2023-02-01 10:01:02 · 1337 阅读 · 0 评论 -
C#中检查null的语法糖,非常实用
注意,如果链式使用的过程中,只要前面运算中有一个是null,那么将直接返回null结果,不会继续计算。下面两个操作会有不同的结果。如果左边是的null,那么返回右边的操作数,否则就返回左边的操作数,这个在给变量赋予默认值非常好用。c#处理null的几个语法糖,非常实用。当左边是null,那么就对左边的变量赋值成右边的。索引器操作,和上面的操作类似。原创 2023-01-30 09:12:58 · 1839 阅读 · 0 评论 -
C#入门Kafka
本章的内容比较简单,我们将使用 Docker 快速部署一个单节点的 Kafka 或 Kafka 集群,在后面的章节中,将会使用已经部署好的 Kafka 实例做实验,然后我们通过不断地实验,逐渐了解 Kafka 的知识点以及掌握客户端的使用。如果一个 Topic 有多个分区,一般来说其并发量会有所提高,通过增加分区数实现集群的负载均衡,一般情况下,分区均衡需要散布在不同的 Broker 才能合理地负载均衡,不然分区都在同一个 Broker 时,瓶颈在单个机器上。每个 Topic 可以划分为多个分区,转载 2023-01-29 14:25:46 · 1230 阅读 · 0 评论 -
分布式协议与算法-Quorum NWR
这里需要你注意的是,无论客户端如何执行读操作,哪怕它访问的是写操作未强制更新副本数据的节点(比如节点 B),但因为 W(2) + R(2) > N(3),也就是说,访问节点 B,执行读操作时,因为要读 2 份数据副本,所以除了节点 B 上的 DATA-2,还会读取节点 A 或节点 C 上的 DATA-2,就像上图的样子(比如节点 C 上的 DATA-2),而节点 A 和节点 C的 DATA-2 数据副本是强制更新成功的。先继续看下面的内容。也就是说,副本数可以不等于节点数,不同的数据可以有不同的副本数。原创 2023-01-28 09:22:52 · 203 阅读 · 0 评论 -
#include<string.h>中的常用函数
1.strcat(1)一般形式:strcat(字符串1,字符串2)(2)功能:将字符串2拼接到字符串1之后(3)函数声明:char *strcat(char *dest, const char *src)(4)几点说明:当字符串1中间有\0时,strcat会把字符串2拼接到第一个\0后面,得到的字符串1输出时,遇到\0停止自己用strcat时,遇到了这种情况:char a[100] = "123", b[] = "456";strcat(a, b);错误C4996 's原创 2021-12-15 11:40:41 · 263 阅读 · 1 评论