- 博客(492)
- 资源 (63)
- 收藏
- 关注
原创 C# Socket异步通讯
利用TCP/IP Socket与设备通讯,接收来自设备的数据,并发送一些指令控制设备做相应的动作,最初的时候写了个简单的socket同步的方法,即连接后利用轮询开启监听数据,这种方法也能用,目前也没发现什么问题,但是想到以后业务量增大,感觉还是改成异步比较好,所以参考了广大网络的智慧结晶写了一个异步的版本。...
2019-12-04 11:12:54
3610
3
原创 EMQX 和 MQTT 的关系
MQTT 是通信协议(规则),EMQ X 是实现这个协议的服务端软件(MQTT broker 消息服务器)。设备(客户端)→ 按 MQTT 协议 发消息 → EMQX 服务器 转发 → 其他订阅设备设备 / 程序(MQTT 客户端) → 遵循 MQTT 协议连接 → EMQX(MQTT Broker) → 发布 / 订阅主题,完成消息交互。
2026-09-20 09:19:44
167
原创 Mysql5.7.44+SQLyog的详细安装教程
选中要导出的数据库->选中数据库右击->备份/导出->备份数据库,转储到SQL->选择要导出存放的路径->导出。新建相同数据名称数据库->选中数据库右击->导入->执行SQL脚本->选择要导入的SQL脚本文件->执行。,会自动生成 data 文件夹。安装 Windows 服务。设置密码为 root。
2026-05-09 17:53:46
411
原创 Mysql5.1.41+SQLyog的详细安装教程
本文介绍了MySQL 5.1.41免安装版的配置与使用步骤:1)下载解压后配置my.ini文件;2)通过CMD初始化MySQL服务,设置root密码;3)验证服务启动后,使用SQLyog工具进行数据库管理,包括导出/导入SQL脚本。最终完成MySQL服务的安装配置,默认用户名root,密码root,端口3306,并实现开机自启动。
2026-05-07 16:39:08
538
原创 抓包工具 Wireshark 是什么?
Wireshark 是一个开源的网络协议分析器,它的核心功能是网络上流动的数据包,并出这些数据包的信息。它本身不会修改网络内容,也不会主动发出数据包,只是一个安静的“观察者”。:它最初在1998年以的名字诞生,后因商标问题在2006年更名为 Wireshark。:在GNU GPL许可证下发布,任何人都可以免费使用和修改。:支持 Windows、macOS、Linux 等主流操作系统。:支持数百种协议的解析,拥有强大的过滤和统计分析功能。
2026-03-19 13:36:03
701
原创 C# Skip + Take 用法
1、Skip(n):跳过前n个元素,Take(n):取前n个元素,两者链式调用可实现精准截取。2、核心场景:分页(如 Skip (10).Take (10) 取第 2 页数据)、提取集合中指定位置的元素(如你的字节数组需求)。3、注意延迟执行特性,需通过ToArray()ToList()等方法触发实际执行。
2026-03-06 14:13:25
472
原创 位运算符有什么实际应用场景
1)位控制类:权限 / 状态掩码、硬件 / 协议位解析(你的核心场景);2)性能优化类:快速乘除、数据分片;3)协议解析类:网络 IP / 子网、颜色值 / 编码解析。
2026-03-05 15:29:31
427
原创 C# &(按位与)和|(按位或)
1)&(按位与):筛选位,用来判断 / 提取指定位(全 1 才 1);2)|(按位或):设置位,用来把指定位强制设为 1(有 1 则 1);
2026-03-05 14:23:58
455
原创 除了 string.Join() 方法,还有哪些方法可以将 List<string> 转换为字符串?
这是替代最常用的方案,尤其适合需要自定义拼接逻辑的场景(比如给元素加前缀 / 后缀、过滤空值),性能远优于直接字符串拼接。
2026-03-03 17:27:21
470
原创 除了C#,还有哪些语言支持目标类型new表达式
核心支持的语言:Java(JDK 16+)、Kotlin、TypeScript 是最接近 C# 目标类型 new 表达式的语言,均支持 “根据变量声明的类型,省略实例化时的类型名”;关键差异C# 的new()依赖 C# 9.0+,且要求类有无参构造;Java 的new()仅 JDK 16 + 支持,Kotlin 无版本限制且更灵活;核心逻辑这类简化语法的本质都是静态类型语言的 “类型推断” 特性,目的是减少代码冗余,提升可读性。
2026-03-03 17:24:30
834
原创 C# 不可变引用类型有什么优缺点
自定义不可变引用类型时,需要遵循严格的规则(字段readonly、无set属性、修改返回新对象等),比写普通可变类更繁琐;如果对象属性多(比如 10 个字段),写WithXXX方法(如WithNameWithAge)会很冗余。1)核心优点:天然线程安全、代码易维护、可安全复用、适合做哈希表键;2)核心缺点:频繁修改时内存 / 性能开销大、实现成本略高、嵌套不可变复杂度高;3)使用原则:状态稳定 / 需线程安全→不可变;频繁修改→可变,按需选择平衡优缺点。
2026-03-03 11:06:25
652
原创 C# 可变引用类型和不可变引用类型
Age = age;// “修改”年龄:返回一个新对象// 使用// p1 保持不变,p2 是新对象set;set;// 使用// p2 引用同一个对象// 修改 p1// Bob (26) —— p2 也变了特性可变引用类型不可变引用类型状态修改可以直接修改对象内容修改操作返回新对象线程安全通常不安全,需同步天然安全,可自由共享内存/性能修改原地进行,无需额外分配每次修改可能分配新对象适用场景需要频繁修改状态的场景需要共享、缓存、哈希键的场景。
2026-03-03 11:00:24
759
原创 C# Scoped 服务详解
Scoped 服务是在ASP.NET每个请求范围(Scope)创建一个实例在同一个 Scope 内,多次请求会得到同一个实例不同的 Scope 会创建不同的实例主要用于 HTTP 请求处理,每个 HTTP 请求对应一个 Scopeint?public int?.User?.Value?.User?.Identity?.Name;.User?.Identity??false;// 注册。
2026-01-21 13:44:50
924
原创 浅谈C# BackgroundWorker 和 BackgroundService 的区别
是 .NET Framework 2.0 引入的,主要用于 WinForms/WPF 等桌面应用程序中的后台任务处理。是 .NET Core 引入的,主要用于ASP.NETCore 应用程序中的后台任务处理。_logger.LogInformation("后台服务启动");while (!try// 使用 Scope 获取 Scoped 服务// 等待一段时间// 正常取消break;_logger.LogError(ex, "后台服务执行错误");
2026-01-21 10:54:51
555
原创 MySQL9.5.0+MySQL Workbench的详细安装教程
在这个路径下新建一个txt文件,名字叫my,修改后缀txt变为ini,然后输入下面的代码:(注意路径要改为上面那个解压的路径)(安装目录和数据的存放目录都需修改)(如果之前在电脑上装过Mysql,那么会报错,要执行下面的删除命令(sc delete mysql)后再安装,没装过就不用管)再系统变量里面点击新建,输入变量名和变量值:(变量名为MYSQL_HOME,变量值为刚刚的路径)切换到相应的目录下后,执行下面的命令:mysqld --initialize --console。
2025-11-06 13:50:51
1021
原创 C# TaskCompletionSource.SetResult 用法详解
SetResult用于手动完成任务并设置结果只能调用一次,后续调用会抛出异常推荐使用来避免异常适用于包装传统异步模式、实现超时控制等场景。
2025-10-31 14:52:50
484
原创 C# DataGridView导出到 Excel 并保持格式一致
EPPlus 5+ 需要设置 LicenseContext,如果是商业用途需要购买许可证。:对于几千行的数据,这个方法是可行的,但如果数据量更大(数万行),可能需要考虑分批处理。:代码会复制 DataGridView 单元格的背景色和字体颜色到 Excel 单元格。:将 DataGridView 中的文本内容和颜色样式同步到 Excel 单元格。:如果你更喜欢使用 ClosedXML,也有类似的 API 可以实现相同的功能。:如果需要复制更多格式(如边框、字体样式等),可以在代码中添加相应的处理逻辑。
2025-07-21 15:43:24
828
原创 Visual Studio Git提交代码提示Git failed with a fatal error.error: open(xxx): Permission denied fatal: xxx
Git failed with a fatal error. error: open(".vs/PdSimMeter/FileContentIndex/29c84339-5e4e-450c-947c-4047d10cf54e.vsidx"): Permission denied fatal: Unable to process path .vs/PdSimMeter/FileContentIndex/29c84339-5e4e-450c-947c-4047d10cf54e.vsidx错误原因:因为git上传
2025-07-16 19:10:19
1026
原创 如何处理从GetSchema方法返回的DataTable对象?
在 C# 中,处理从返回的对象时,通常需要遍历表格行()并提取所需的元数据。以下是常见的处理模式和示例:只获取基础表(排除视图):使用集合,并筛选特定表的列:创建模型类,批量转换数据:判断结果集是否包含特定列:使用 LINQ 查询(需引入):不同数据库的列名可能不同(如在 MySQL 中可能是,在 SQL Server 中可能是):
2025-07-12 10:56:58
377
原创 多线程数据共享BlockingCollection和ConcurrentQueue的区别
可设置最大容量,当队列满时,生产者线程会自动阻塞,形成天然的背压机制。无容量限制,生产者可无限添加,可能导致内存溢出。简单的生产者 - 消费者模式、自动阻塞、容量限制、优雅的完成标记。高性能无锁队列、手动控制生产消费逻辑、自定义扩展。专注于高效的队列操作,无额外抽象层,性能更优。可包装多种并发集合(如。),支持自定义数据结构。
2025-07-11 11:07:29
826
原创 电力系统IEC-104报文主要常用详解
I帧与S帧中的发送序号和接收序号用来防止I帧报文在传送过程中丢失或者重复。发送方每发送一个I格式报文,其发送序号应加1,接收方每接收到一个与其接收序号相等的I格式报文后,其接收序号也应加1。由于代表序号的最后一位未使用(一直为0),所以报文中“序号”像是以“2”为步长进行递增。当子站发送了若干帧I格式报文后,需要主站用S格式报文予以确认,S格式报文会将子站发送的发送序号小于等于其接受序号的报文全部确认。S格式和U格式报文的发送不会改变子站发送的I格式报文中的发送序号序列。
2025-07-10 10:05:13
2898
2
原创 C# ConcurrentDictionary 中获取指定范围的元素
需要注意的是,ConcurrentDictionary 的元素顺序是不确定的,除非你显式排序。如果元素的顺序对你很重要,建议使用其他有序集合或在查询时明确指定排序方式。不过需要注意的是,ConcurrentDictionary 是无序集合,获取的元素顺序可能不固定。中获取第 2 到第 5 个元素(索引 1 到 4,因为索引从 0 开始),可以使用 LINQ 的。这段代码的核心是使用。
2025-06-11 16:55:54
465
原创 C# StringBuilder代码中预分配容量的作用
初始容量通常为 16,随着内容增加,会触发多次内存重新分配(16 → 32 → 64 → 128 → 256 → ...)。一次性分配足够的内存(如 800),整个过程无需重新分配,效率显著提升。通过合理预估并分配初始容量,可以显著减少内存操作开销,提升代码执行效率。对于极大量数据(如百万级字符),可考虑分批处理或使用更高效的数据结构。根据输入数据的规模和特征,估算最终字符串的大致长度。对于大数据量的字符串拼接,预分配容量可能带来。构造函数预分配足够的容量,可以。,从而提高字符串拼接的效率。
2025-06-10 15:43:43
520
原创 C# 如何从ConcurrentDictionary中获取并移除第二个元素
是无序集合,"第二个元素" 的定义可能依赖于迭代顺序(通常是插入顺序,但不保证)。中获取并移除第二个元素,需要先获取元素的快照,然后尝试移除指定位置的元素。如果需要严格控制元素顺序,建议使用。
2025-06-07 09:15:00
398
原创 C# 从 ConcurrentDictionary 中取出并移除第一个元素
C# 从 ConcurrentDictionary 中取出并移除第一个元素要从中取出并移除第一个元素,需要结合和。由于是无序集合,"第一个元素" 通常是指最早添加的元素(按插入顺序)。
2025-06-04 17:19:49
883
原创 在 Windows 中使用 IHost 创建和运行 Windows 服务
在 C# 中,使用IHost接口创建 Windows 服务是一种现代且灵活的方式,特别是在 .NET Core 和 .NET 5+ 中。
2025-05-31 10:30:00
627
原创 列举一些RTU和PLC在工业自动化领域的实际应用案例
以下是一个简化的 PLC 控制汽车生产线的程序示例,使用结构化文本(Structured Text)语言编写,模拟汽车车身焊接、喷涂和装配的基本流程。
2025-05-27 08:39:33
585
原创 RTU与PLC在功能上有哪些异同点?
RTU(远程终端单元)和 PLC(可编程逻辑控制器)均为工业自动化领域的核心设备,但在功能定位、应用场景等方面存在显著差异。均配备串口(RS232/RS485)、网口等通信接口,用于连接传感器或上位机。
2025-05-27 08:35:53
1460
原创 如何在MyBatis的动态SQL中进行分页查询
MyBatis 加载全部数据到内存后,通过。:通过 SQL 语句直接在数据库层实现分页。:编写完整的查询 SQL(无需分页参数)。分页查询通常依赖排序,确保排序字段有索引。这种大偏移量查询,可通过索引覆盖或。:数据量较小,或需要兼容多种数据库。指定偏移量和每页数量。:数据量大,需优化性能。:正常定义查询方法。)自动处理分页逻辑。
2025-05-26 10:03:19
1230
原创 进程守护服务优点
进程守护服务通过 “监控 - 检测 - 恢复 - 报警” 的闭环机制,解决了进程运行中的稳定性难题,是保障系统可靠性、降低运维成本的核心技术手段。在实际应用中,需根据业务需求选择合适的工具,并结合日志分析、性能监控等形成完整的系统保障体系。进程守护服务(Process Watchdog Service)是一种用于监控和管理进程运行状态的工具或机制,其核心目标是确保关键进程持续稳定运行,自动处理进程异常(如崩溃、无响应、意外终止等)。
2025-05-25 09:45:00
963
Modbus从站模拟软件
2024-08-01
SocketAsyncEventArgs 异步Socket
2023-11-23
C#8.0 引入那些好用的新特性?
2024-07-31
Socket粘包处理方式?
2024-07-31
多线程处理TCP请求
2024-07-31
C#和Java哪个前景好?
2024-07-30
C# ORM框架 好用吗?有没有简单示例?
2024-07-30
.NET Reactor .NET代码混淆工具好不好用?
2024-07-29
TouchSocket使用场景
2024-07-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅