<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>yycoding-记录编程点滴</title><description>.NET Developer,前微软最有价值专家(2012-2016)</description><link>https://www.yycoding.xyz/</link><pubDate>Mon, 27 Apr 2026 19:17:02 GMT</pubDate><copyright> ©2011-2026 yycoding.xyz</copyright><generator>Moonglade v12.9.1</generator><language>en-US</language><item><title>中金所股指期权介绍以及保证金计算</title><link>https://www.yycoding.xyz/post/2026/1/30/introduction-to-china-financial-futures-exchange-stock-index-options-and-margin-calculation</link><description>在量化交易的版图中，股指期权（Stock Index Options）不仅提供了非线性的收益结构，更是机构投资者进行波动率管理与风险对冲的核心工具。中金所（CFFEX）的股指期权合约（IO/HO/MO）不仅交易规则复杂，其保证金计算机制更是风控系统开发中的一道坎。本文从程序员的视角出发，解析期权与期货的联动逻辑，并从技术层面解决如何从 CTP 接口中计算期权合约保证金，最终构建一个兼顾盘中估算与盘后结算风控的 C# 资金计算模型。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><guid isPermaLink="false">35BE0CC0-BCE2-49BB-99F6-594D3A2D963E</guid><pubDate>Thu, 29 Jan 2026 23:46:10 GMT</pubDate></item><item><title>订单簿重建引擎的架构演进与性能优化</title><link>https://www.yycoding.xyz/post/2026/1/26/architectural-evolution-and-performance-optimization-of-the-orderbook-reconstruction-engine</link><description>在构建低延迟交易系统时，全速盘口（OrderBook）的实时重建是数据处理链路中计算密度最高、对延迟最敏感的环节之一。本文将详细阐述 FastMarketDataManager 组件的演进历程，分析从单线程模型到静态分片，再到基于消息队列的动态负载均衡架构的技术决策过程，重点介绍如何在保证数据严格时序的前提下，摒弃了传统的加锁同步方案，转而利用消息队列的 FIFO 特性，设计了基于控制指令（Command Pattern）的异步迁移流程，解决热点股票引发的队头阻塞（Head-of-Line Blocking）问题。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Data Structures and Algorithms</category><category>Design Patterns</category><guid isPermaLink="false">11327188-83EC-42CC-A01D-764B3C8C5522</guid><pubDate>Mon, 26 Jan 2026 00:13:51 GMT</pubDate></item><item><title>实现一个简单的基于语义的C#代码比较工具</title><link>https://www.yycoding.xyz/post/2025/12/1/implement-a-simple-semantic-comparison-tool-for-csharp-base-on-roslyn</link><description>代码比较功能在很多版本管理工具中都存在，比如Git和TortoiseSVN，Compare Beyond中也有。这个功能可以很方便的帮助我们查看代码的变更。目前这些工具都是简单的基于文本差异的比较。然而在有些时候，我们需要基于语义的比较，比如在代码中，我只是调整了方法的前后顺序、添加了一些注释、删除了一些语句之间的空格，或是将一个大的类使用partial关键字，拆分到多个源文件中。在这种情况下，传统的基于简单文本进行代码比较的方式则失去了应有的作用。我们需要保证代码的逻辑和正确定不变即可，而不关心代码的书写格式，比如行号，空格，注释，格式化这些。本文基于Roslyn实现了一个简单的基于语义的C#代码比较工具。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">77D495EE-A344-40ED-B03A-18BAD8E7AB04</guid><pubDate>Sun, 30 Nov 2025 23:43:55 GMT</pubDate></item><item><title>实现一个TCP中继器</title><link>https://www.yycoding.xyz/post/2025/11/5/implement-a-tcp-relay</link><description>在之前实现端口转发的几种方法这篇文章中，介绍了三种实现端口转发的方法，本质就是建立一个TCP中继： tcpReplay.jpg  TCP中继 但要完整实现一个TCP转发或者代理(Tcp Relay)，还是有很多细节需要考虑。在《Linux多线程服务端编程：使用muduo C++网络库》这本书中，作者提到了以下需要考虑的问题： 建立连接。TCPRelay在接受client的连接C之后才向server发起连接S，那么在S建立之前，从C收到的数据如何处理？要不要暂存起来？ 并发连接的管理。上图中只画了一个client，实际上TcpRelay可以服务多个client，这两边的并发连接如何管理，如何防止串话(cross talk?) 连接断开。client和server都可能主动断开连接。当client主动断开连接C时，TcpRelay应该立刻断开S。当server主动断开连接S时， …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Data Structures and Algorithms</category><guid isPermaLink="false">C3C60944-4B8B-469C-99B4-05BA8E6F27E2</guid><pubDate>Tue, 04 Nov 2025 19:39:08 GMT</pubDate></item><item><title>使用MSChart绘制专业的蜡烛图</title><link>https://www.yycoding.xyz/post/2025/9/23/draw-a-professional-candlestick-chart-using-microsoft-chart-controls</link><description>MSChart(System.Windows.Forms.DataVisualization.Charting.Chart)是Visual Studio中的一个功能强大的图表控件。用它绘制基础图标非常方便，但是要构建一个功能完善的K线图绘制工具，其默认的行为有时会显得捉襟见肘，要实现一个常用的专业的金融软件里面那样的K线图，则需要进行很多细节调整，包括：像素级的精确定位、智能的坐标轴刻度、平滑准确的交互式缩放，这些细节的打磨都需要仔细考虑。 这篇文章总结了开发K线图时遇到的这些问题，基本上能实现一个功能强大，体验较好的专业K线图组件。 一、 搭建图表结构 一般的K线图都包含价格区和成交量区双区域，其中价格区间是包含高开低收的K线图，成交量区是K线对应的成交量柱状图。一些交易软件在成交量区下面还会包含一些证券分析指标图，比如MACD，KDJ等之类的图。 多图表区域布局与对齐 多图表区域布局的 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><guid isPermaLink="false">33EB4518-052D-48BB-AFF7-91833003C267</guid><pubDate>Mon, 22 Sep 2025 22:08:20 GMT</pubDate></item><item><title>C# 进程间通信深度解析：命名管道、TCP/IP 与内存映射文件</title><link>https://www.yycoding.xyz/post/2025/8/5/in-depth-analysis-of-inter-process-communication-in-csharp-named-pipes-tcp-ip-and-memory-mapped-files</link><description>在现代软件架构中，无论是模块化的单体应用、面向服务的架构（SOA），还是日益普及的微服务部署，进程间通信（Inter-Process Communication, IPC）都已从一个简单的实现细节，演变为影响系统性能、安全性与可维护性的基石性架构决策。在此背景下，选择一种合适的 IPC 机制，不仅关乎数据传输的效率，更直接决定了整个系统的响应能力、资源消耗和技术债务。本文介绍了Windows平台上三种主流的IPC通讯方式：命名管道（Named Pipes），   TCP/IP 套接字（TCP/IP Sockets），和内存映射文件（Memory-Mapped Files, MMF），给出了在一对一通讯场景下的企业级实现，并基于BenchmarkDotNet，使用乒乓测试的方式测试了三者的性能，结果显示，在本机IPC模式下，小字节的数据（16B，256B）传输下，内存映射文件的传输效率具有绝 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">D7FD1AD0-99E5-4F1B-ACE0-328B055CDEB6</guid><pubDate>Mon, 04 Aug 2025 17:08:20 GMT</pubDate></item><item><title>使用内存映射文件实现进程间通讯</title><link>https://www.yycoding.xyz/post/2025/8/4/implement-inter-process-communication-using-memory-mapped-files</link><description>在前文浅谈内存映射文件中详细介绍了什么是内存映射文件（Memory-Mapped File, MMF），以及内存映射文件的用法。在其诸多应用中，很重要的一个就是进程间通讯（Inter-Process Communication，IPC）。内存映射文件允许将文件内容直接映射到进程的虚拟地址空间，使得应用程序能够像访问内存一样访问文件数据。但要正确和高效地使用内存映射文件进行进程间通讯则需要一些技巧，它需要处理多个进程对同一块内存区域进行高效的读写问题，这里就自然涉及到竞争和同步。本文首先介绍了一个简单的一对一的使用MMF进行进程间单向通讯的例子，紧接着指出其中的低效，然后通过引入环形队列数据结构来分隔读和写，从而达到移除锁的使用，进而大幅提高效率。最后在此基础上介绍了一对一双向通讯，以及一对多通讯的实现思路。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><guid isPermaLink="false">1D324A68-DBFA-4C1B-98A1-21413BEA42F8</guid><pubDate>Sun, 03 Aug 2025 19:30:53 GMT</pubDate></item><item><title>浅谈内存映射文件</title><link>https://www.yycoding.xyz/post/2025/7/18/a-brief-introduction-of-memory-mapped-file</link><description>内存映射文件（Memory-Mapped File, MMF）允许将文件内容直接映射到进程的虚拟地址空间，使得应用程序能够像访问内存一样访问文件数据。这种机制通过操作系统虚拟内存管理器（Virtual Memory Manager, VMM）的深度集成，绕过了传统I/O操作中固有的数据复制和系统调用开销，从而在特定场景下实现数量级的性能提升。对于开发那些需要在I/O性能上达到极致的系统（如数据库、大数据分析平台、金融交易系统）而言，深入理解并掌握MMF是不可或缺的关键技能。 从传统I/O到内存映射的转变 传统的文件I/O，如通过FileStream进行的操作，其本质是指令驱动的。开发者通过Read、Write、Seek等命令，显式地请求操作系统在内核缓冲区和用户空间缓冲区之间移动数据 。这个过程涉及多次数据复制和频繁的上下文切换，是典型I/O瓶颈的根源。 相比之下，内存映射文件是一种状态驱 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><guid isPermaLink="false">EC877E91-02ED-416B-8E7D-B77B1FEF2377</guid><pubDate>Fri, 18 Jul 2025 03:45:04 GMT</pubDate></item><item><title>Windows服务“伪运行”之谜：从一个时间同步服务的失灵谈起</title><link>https://www.yycoding.xyz/post/2025/6/20/the-pseudo-running-windows-service-enigma-a-case-study-of-a-failing-time-synchronization-service</link><description>本文通过一个时间同步服务的具体案例，深入探讨了Windows服务在“快速启动”模式下出现的“伪运行”问题。该问题的典型症状是：服务设置为自动启动，在“关机”再开机后，其状态显示为“正在运行”，却没有执行其OnStart方法中的关键启动任务（如首次时间同步）。文章剖析了此现象的根本原因在于Windows的快速启动机制。该机制通过休眠并恢复系统内核及服务进程来加速开机，这个过程会完全跳过OnStart方法，导致服务从一个过时的、无效的内存状态中“假醒”，成为“僵尸服务”。为解决此问题，文章提供了一套完整的排查与解决方案。首先，介绍了如何通过正确配置Windows事件日志来进行有效诊断，并指出了创建事件源的权限要点。其次，说明了如何通过禁用快速启动来快速验证问题根源。最终，文章给出了最健壮的根本性解决方案：在C#服务代码中重写OnPowerEvent方法，使其能够响应系统的Suspend …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><guid isPermaLink="false">36C40B5F-08DD-43ED-9722-DBEFA870165D</guid><pubDate>Thu, 19 Jun 2025 23:27:16 GMT</pubDate></item><item><title>不止于值：解析.NET中“赋值即触发”的状态驱动事件模式</title><link>https://www.yycoding.xyz/post/2025/6/19/more-than-just-a-value-analyzing-the-assignment-as-trigger-state-driven-event-pattern-in-dotnet</link><description>即便是给一个对象的属性赋上与它当前完全相同的值，相关的“已更改”（XXXChanged）事件依然被触发了。一个典型的例子就是在使用 System.Data.DataTable 或System.Configuration.ApplicationSettingsBase时。研究源码发现，ApplicationSettingsBase 和 DataTable 的“赋值即触发”行为，并非缺陷，而是.NET框架中一个优雅且实用的状态驱动事件模式的体现。它将数据容器从简单的值存储器提升为强大的状态机，极大地简化了数据持久化和同步的复杂性。它选择牺牲微不足道的判断性能，来换取核心功能（状态跟踪）的绝对可靠性。理解了其“关注状态，而非价值”的核心思想，并洞悉其源码实现后，我们就能根据实际场景，明智地选择是利用还是“修正”这一行为，从而编写出更健壮、更高效的.NET应用程序。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Design Patterns</category><guid isPermaLink="false">5CD05F4F-B3FA-4EA9-BB35-45305EAC1A80</guid><pubDate>Thu, 19 Jun 2025 00:25:31 GMT</pubDate></item><item><title>使用NTP协议实现时间同步客户端和授时服务端</title><link>https://www.yycoding.xyz/post/2025/6/6/implement-a-time-synchronization-client-and-a-time-serving-server-using-the-ntp-protocol</link><description>在之前写了两篇关于NTP的文章，一篇是使用NTP协议实现本地时间跟NTP授时服务器进行同步介绍了NTP协议的原理，另一篇是实现一个时间同步客户端NTPClock介绍了使用WPF编写一个模仿NTPClock的时间同步的App，因为Windows的自动较时功能不是很完善，所以这个应用我自己使用了很长时间。 在这篇文章里，我准备将前面两篇文章总结一下，对一些方法进行重构，另外实现一个利用NTP来实现授时的服务端，以完善整个功能。一般的我们都是使用一些公开的NTP授时服务地址，比如"time.windows.com"、"pool.ntp.org"等来获取时间，这有一些限制： 必须要求这个服务器能够访问和解析这些授时服务器地址，这在有些机房的内网计算机上其实是无法满足条件的。 这些公开的NTP授时服务器大多有请求频率限制，如果请求次数多过或过快，可能会请求失败。  有时候，我们有自己的GPS接收装置 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><guid isPermaLink="false">50B3BFF8-6C1D-4BE8-8845-F53F376F8EA5</guid><pubDate>Thu, 05 Jun 2025 21:52:34 GMT</pubDate></item><item><title>浅析C#中异步编程以及TAP模式</title><link>https://www.yycoding.xyz/post/2025/5/28/a-brief-introduction-of-asynchronous-programming-and-task-based-asynchronous-pattern-in-csharp</link><description>虽然C#转眼间已经发展到了14.0版本，但有些在 C#5.0 引入并随.NET Framework 4.5一同发布的特性比如async和await我仍不是很清楚，然而这些新特性在一些人工智能生成的代码中使用的越来越多，因为它们确实能够提高异步编程时代码的清晰度，所以最近几天好好研究了一下它的原理。异步编程可以解决线程因为等待独占式任务而导致的阻塞，但异步编程一直是一个难点，如何正确实现异步模式却不容易，因为它涉及到诸如状态管理，异常管理，同步上下文，异步任务组合等等诸多问题。C#中有很多异步编程模型，最早的有APM (Asynchronous Programming Model) ，随后有EAP(Event-Based Asynchronous Pattern)以及建立在EAP基础上的BackgroundWorker等等，这些异步编程模型在场景比较简单时可能可以满足要求，但 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><guid isPermaLink="false">66125153-C91E-468A-A2AE-8AF16C69A66C</guid><pubDate>Tue, 27 May 2025 16:15:31 GMT</pubDate></item><item><title>一个完整的阻止远程桌面登录攻击的程序</title><link>https://www.yycoding.xyz/post/2025/4/28/a-complete-program-to-block-remote-desktop-login-attacks</link><description>在大概一年多以前，我写了一个简单的通过程序判断和阻止来自特定IP地址的远程桌面连接攻击的程序，一直以来是作为一个简单的控制台程序来使用的，用起来效果很不错。最近我在自己的阿里云服务器上也发现了很多这种远程桌面登录连接的尝试，但这也没有办法，只要端口对外网暴露，就免不了会有这种攻击。于是我对之前的那个小程序做了一些调整和完善，主要改进了：
程序不一定要监控特定端口，只要在日志里查找到了类型ID为4625的错误日志，就认为是远程桌面连接登录。
当远程桌面登录失败尝试超过3次后，除了添加到防火墙之外，还记录该远程信息到日志，包括远程IP尝试登录时采用的用户名，IP归属地等信息。
平台使用最新的.NET 8.0来重写，程序可以作为控制台程序，或Windows Service 安装运行。
添加白名单机制，对于白名单里面的IP地址不做登录失败校验。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><guid isPermaLink="false">328179F6-73EA-42E5-9815-71635999F5D0</guid><pubDate>Mon, 28 Apr 2025 00:18:40 GMT</pubDate></item><item><title>从零开始申请Google Gemini Advance 15个月免费试用</title><link>https://www.yycoding.xyz/post/2025/4/24/apply-for-a-15-months-free-trial-of-google-gemini-advance-from-scratch</link><description>最近大模型热火朝天，于是我也开始在工作中尝试使用这类工具来提高编码效率。工作中编码时，我主要使用的是豆包，它有专门的桌面客户端。本文介绍了如何申请Google Gemini Advance的15个月免费试用，内容包括如何使用稳定线路的美国网络，如何提供满足条件的Google账户，如果申请美国edu邮箱，如何申请符合条件的美国信用卡，在满足以上条件之后，如何免费申请Google Gemini Advance的15个月学生优惠免费试用。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><guid isPermaLink="false">7370E232-DD6E-448B-98E9-33DB1F784E6E</guid><pubDate>Wed, 23 Apr 2025 19:23:16 GMT</pubDate></item><item><title>自定义JSON序列化</title><link>https://www.yycoding.xyz/post/2025/4/18/customize-json-serialization</link><description>JSON的序列化和反序列化在工作中偶尔会用到，特别是在处理网络请求的时候。通常的网站或者api接口会提供json数据格式，要将json字符串转换为C#中的对象，就要用到序列化和反序列化。恰好最近刚有一个需求，需要从某个网站上获取一下Shibor数据，这里涉及到了自定义的JSON序列化，简单记录一下。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><guid isPermaLink="false">EF01387D-2597-4D5A-9FC5-2276EB0FBA8E</guid><pubDate>Thu, 17 Apr 2025 22:15:04 GMT</pubDate></item><item><title>解决Socket编程中对端意外断开而导致的“卡死”问题</title><link>https://www.yycoding.xyz/post/2025/4/16/solving-the-freezing-problem-caused-by-the-unexpected-disconnection-of-the-peer-end-in-socket-programming</link><description>在上一篇文章中提到了最近写的一个网络收发程序的一个问题。一开始还以为是因为计算机休眠会把线程杀死，导致程序在唤醒后接收不到服务端程序发送的数据，后来通过使用WinDbg分析dmp文件发现在网络异常断开后，接收数据的线程并没有退出，而是程序卡在了NetworkStream.Read方法那里，即使后来网络连通了也得不到通知和接收不了数据。这就引出了本篇要解决的问题，即在网络收发中，如何解决由于网络意外断开，客户端程序Socket的卡在了网络读取方法的问题。解决方法有两种：一种是在客户端读取数据时添加超时，另外就是增加心跳。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><guid isPermaLink="false">E735E0BD-4E11-444D-A98C-24D42626644A</guid><pubDate>Tue, 15 Apr 2025 18:18:21 GMT</pubDate></item><item><title>使用WinDbg查看所有的C#线程及其名称</title><link>https://www.yycoding.xyz/post/2025/4/10/use-windbg-to-view-all-csharp-threads-and-their-names</link><description>最近程序遇到了一个问题，当写的一个C#客户端程序在Windows 11系统休眠之后再次唤醒，有一定的概率不能够正常的接受服务端的数据。这个程序有一个专门用于连接服务端的C# 线程，名字为"WatchServiceTransport"，它的内部是一个while循环，不停的从服务端使用Socket的NetworkStream.Read读取数据。在正常的时候，程序是能够接收数据的。但是当Windows休眠之后，此时网络连接可能断开，此时即使Windows唤醒之后仍然不能连接收取数据。于是怀疑是否是因为Windows 11休眠后，连接TCP的线程被强制退出了。那如何验证是否是这个原因导致的呢？就需要判断在出现问题时，当前的名为“WatchServiceTransport”的线程还是否存在。

幸好，今天这个问题又复现了于是导出了DUMP文件，用Windbg分析了一下，顺便记录如何打印所有的C#线程 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><guid isPermaLink="false">F2FCB6C8-232F-472B-9D1D-C6CA2719E7F4</guid><pubDate>Wed, 09 Apr 2025 23:54:00 GMT</pubDate></item><item><title>使用treemap图来显示沪深300指数热点图</title><link>https://www.yycoding.xyz/post/2024/9/30/display-hotspot-map-of-hs300-index-using-treemap</link><description>前几天看到一篇新闻里做的下面这张股票热点图，单纯的觉得这个图很好看，于是研究了一下如何自己绘制这个图，后来发现这种类型的图还有个专有的名字，叫treemap图。本文先介绍什么是treemap图，然后展示如何使用C#来生成沪深300指数的treemap。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><category>Data Structures and Algorithms</category><guid isPermaLink="false">FCD0D480-8274-4DEB-8877-57BD94E0B2C0</guid><pubDate>Sun, 29 Sep 2024 22:58:32 GMT</pubDate></item><item><title>实现端口转发的几种方法</title><link>https://www.yycoding.xyz/post/2024/8/30/several-methods-for-implementing-port-forwarding</link><description>端口转发在有些时候还是比较有用的，它能够在数据传输的过程中增加一个“路由”，提供了某种程度的灵活。本文简单介绍了工作中遇到的一个可能使用端口转发能解决的例子，以及如何使用端口转发，包括介绍了在Windows上的内置的端口转发工具，以及一些开源的端口转发程序，最后再简单介绍了如何使用C#实现一个端口转发工具。 …</description><author>xjdx2008@126.com</author><category>C++</category><category>DotNet Framework</category><guid isPermaLink="false">712DDBA1-4C82-41C1-B1A8-1F1FCDE9F329</guid><pubDate>Thu, 29 Aug 2024 22:54:35 GMT</pubDate></item><item><title>Math.Round中MidpointRounding各种枚举值的区别</title><link>https://www.yycoding.xyz/post/2024/6/6/differences-in-various-enumeration-values-of-midpointrounding-in-math-round</link><description>通常，在保留n位小数进行四舍五入的时候，会用到Math.Round方法，但默认的这个Round方法的实现可能与我们平常想象的不一样，在很早之前我就知道有这个差别，今天重新整理一下。简单来说，Math.Round方法除了提供了第二个保留小数位数的参数之外，还有一个名为MidpointRounding的枚举类型参数，这个参数在.NET Framework 4.8及.NET Core 3.0版本之前，只提供了两个Round nearest类型枚举值: ToEven和AwayFromZero。这两个值的区别只在于当遇到中值5时的舍入问题。在.NET Core 3.0及之后的版本中，又引入了三个枚举值：ToZero、ToNegativeInfinity和ToPositiveInfinity这三个值，这个三个值解决了是直接舍掉、整体向下还是整体向上舍入的问题。 …</description><author>xjdx2008@126.com</author><category>DotNet Framework</category><guid isPermaLink="false">41E8CD51-62B5-4CA1-A718-D4783CB4C68B</guid><pubDate>Wed, 05 Jun 2024 23:46:07 GMT</pubDate></item></channel></rss>