Anduin Xue
Anduin Xue

Anduin's Tech Blog

.NET Topics about .NET Core and C#


复习数据结构 - 撸个哈希树

本文通过构建二叉哈希树结构探索了时间复杂度为O(1)的集合实现方案。该方案通过将输入字符串的哈希值转化为二进制路径,在树结构中逐位判断左右分支构建节点,最终在终端节点标记存在状态。测试结果验证了其在百万级数据插入后仍能保持快速查找的特性,但哈希碰撞问题导致存在误判风险。这种结构在空间换时间的策略下,特别适合用于低精度场景的快速判断如用户注册状态检测。当哈希碰撞概率与内存消耗的平衡点如何取舍?是否可以通过引入多级哈希或动态调整树结构来降低碰撞率?面对大规模数据场景时二叉树的深度是否会成为性能瓶颈?这些开放问题提示着数据结构设计始终需要在理论最优与实际约束之间寻找最优解。--Qwen3

Binary Tree Custom Collection Binary Hash Trie Data Structure Hashing Set Operations

How to use C# to manage InfluxDB data

这篇文章介绍了如何通过C#语言操作InfluxDB时间序列数据库的完整实践路径。InfluxDB作为专为高并发时序数据设计的存储引擎正在重塑物联网传感器数据、应用性能监控等场景的数据处理方式。通过Docker容器化部署可快速完成环境搭建并获取API访问权限。C#开发者借助InfluxDB.Client库能够实现数据写入、查询的全流程操作——从配置连接参数到创建存储桶,从构建带时间戳的PointData对象到使用InfluxDBQueryable或Flux查询语言进行数据检索。代码示例展示了如何将日志信息结构化存储,并通过两种不同查询方式验证数据持久化效果。这种将C#与时序数据库结合的架构不仅简化了实时数据分析的复杂度,更引发了关于传统数据处理范式与时间维度深度结合的思考:当所有数据都天然携带时间戳时,我们是否需要重新定义数据建模的规则?在物联网设备持续产生指数级时序数据的今天,如何通过C#语言特性优化数据流处理效率?这些值得探索的问题或许能启发开发者重新审视实时数据的价值挖掘路径。--Qwen3

C# Database .NET Docker InfluxDB Flux Query Language

C# start a process and get output. (Fix process won't quit issue)

在C#中启动外部进程并获取输出看似简单但隐藏着易被忽视的陷阱。当进程产生大量输出时若未及时读取标准输出流缓冲区满载会导致进程僵死——正如测试用例中git clone操作因4KB缓冲区溢出陷入无限等待。这种现象揭示了进程间通信的本质矛盾:输出流消费速度必须匹配生产速度。文章通过对比错误代码与修正方案展示了如何通过并行读取输出流与等待退出状态打破僵局。修正后的实现采用MemoryStream捕获输出流并借助Task.WhenAll同步三路异步操作(标准输出/标准错误/进程退出),这一设计既避免了阻塞又保留了完整输出内容。测试套件验证了方案的鲁棒性:从超时处理到异常捕获再到大规模输出验证,每个用例都暗含进程管理的关键考量。值得注意的是,这种解决方案引发更深层的思考:当缓冲区大小成为系统瓶颈时如何在不同编程语言中实现类似机制?若目标进程同时写入标准输出和标准错误流能否设计更高效的消费策略?最后提出一个开放性问题:当外部进程的输出模式不可预测时,我们该如何动态调整流读取策略以确保系统的稳定性与响应性?--Qwen3

C# git .NET Process Process Management Git Commands

Show .NET code coverage rate and unit test status with GitLab CI\CD pipeline

本文展示了一种通过GitLab CI/CD管道自动展示.NET项目代码覆盖率与单元测试状态的完整实践方案。文章从项目结构配置开始指导读者如何通过NuGet包集成coverlet.collector和JunitXml.TestLogger实现测试数据收集,并通过精心设计的.gitlab-ci.yml文件构建包含构建测试发布三个阶段的自动化流水线。核心创新点在于利用正则表达式提取覆盖率数据并结合reportgenerator工具生成标准化报告,最终在GitLab界面实现测试结果可视化和代码覆盖率徽章展示。这种方案不仅实现了持续集成的自动化验证功能,更通过可视化数据为代码质量监控提供了直观依据。当测试覆盖率在合并请求中动态呈现时开发者能即时感知代码改动对测试覆盖的影响这种实时反馈机制是否能推动团队建立更严谨的测试文化?当覆盖率数据与代码质量指标产生关联时如何设计合理的阈值预警机制?或许我们更应该思考在追求高覆盖率的同时如何确保测试用例的有效性和维护性?这些值得深思的问题正在等待每一位实践者去探索答案。--Qwen3

.NET Test Code coverage Continuous Integration GitLab junit YAML

Read from joystick output based on C#

C#代码如何将游戏外设转化为数据中心的控制中枢?一位开发者通过Thrustmaster TCA Airbus油门踏板与SharpDX.DirectInput库的组合,展示了硬件与软件的跨界融合。当航空主题的油门踏板遇见服务器机房,传统控制逻辑被彻底重构——通过解析Joystick对象的缓冲数据流,物理操作的微妙变化被转化为精确的数字信号,进而映射到服务器风扇转速的调节。这种突破性应用不仅挑战了游戏外设的传统定位,更揭示了日常设备在工业场景中的潜在价值。代码中128字节的缓冲区设置与无限循环的配合,暗示着实时控制系统的底层逻辑,而无需额外驱动的直接访问方式则展现了Windows API的开放性。当开发者将航空设备的精密运动转化为服务器散热的动态调节,是否意味着所有物理交互都能找到数字世界的对应物?在游戏手柄与工业设备的边界逐渐模糊的当下,我们是否正在见证人机交互范式的根本性转变?当每个摇杆动作都能触发数据中心的物理响应,这是否预示着物联网时代最基础的控制单元正在被重新定义?--Qwen3

C# Game SharpDX DirectInput Joystick Thrustmaster TCA

Raise up Visual Studio Code correctly in your C# client-side program

在开发需要与Visual Studio Code联动的C#客户端程序时开发者常陷入一个认知盲区:如何突破传统教程的框架实现"从程序中调用编辑器"的逆向交互。本文揭示了一个被忽视的系统调用机制——通过ProcessStartInfo的UseShellExecute属性触发Windows外壳程序执行链,这个看似简单的布尔值设置实则打通了程序与编辑器的深层连接通道。当开发人员试图将文件夹路径注入VS Code时隐藏的控制台窗口与指定工作目录的组合策略构成了体验优化的双重维度。这种技术方案背后暗含着对操作系统进程管理的深刻理解:为何必须依赖外壳执行?隐藏控制台是否会影响系统稳定性?当跨平台需求出现时如何保持接口一致性?这些未解之谜引导我们思考更深层的技术哲学——在软件生态日益碎片化的今天,如何构建程序间优雅的协作范式?或许答案就藏在那些被默认设置遮蔽的API细节中。--Qwen3

C# VSCode WPF c# programming vs code process.start

Validate an object in any C# projects

这篇文章探讨了C#项目中对象验证的最佳实践并提出了重构传统验证逻辑的创新思路。通过对比传统多层if-else验证方式带来的代码冗余问题,揭示了将验证规则内聚到数据模型中的重要性。文章展示了如何在非ASP.NET Core项目中复用框架的模型验证机制,通过定义[Required]、[MinLength]等数据注解实现声明式验证,并进一步演示了自定义[NoSpace]属性验证规则的完整实现过程。特别值得关注的是文中提供的递归验证解决方案,该方案利用反射技术实现了对嵌套对象图的自动验证,为复杂对象的校验提供了优雅的解决方案。当面对跨层级对象的验证需求时如何设计更智能的规则继承机制?当验证规则需要动态调整时如何构建可扩展的验证框架?这些开放式问题为开发者提供了深入思考的方向,启发我们探索如何将验证逻辑与领域模型深度结合,同时思考如何将这种声明式验证模式迁移到其他编程范式中。--Qwen3

ASP.NET Core C# .NET Validation DataAnnotations Custom Validation

C# Play with GZip.

这篇博客展示了如何通过C#为字符串添加GZip压缩功能的扩展方法揭示了数据压缩技术在现代编程中的实用价值。通过构建包含ZipToBase64和UnZipBase64方法的扩展类开发者可以轻松实现字符串的压缩与解压操作在示例代码中反复压缩的字符串通过Base64编码实现了体积的显著缩减这种数据处理方式是否暗示着更高效的存储方案值得深入思考当压缩后的数据长度突破原始字符串限制时是否会引发新的技术挑战而Base64编码与GZip压缩的组合是否意味着存在更优的编码策略当我们面对海量数据时这种压缩方法是否能承受性能压力又该如何平衡压缩率与处理效率的矛盾这些问题或许能为优化数据传输方案提供新的思路而测试用例中验证的压缩效果是否意味着在特定场景下可以完全替代传统存储方式呢--Qwen3

C# .NET Compress GZip Base64 string extension

Why you should never use `Console.WriteLine`

本文探讨了在库代码中使用`Console.WriteLine`的潜在问题及其替代方案。文章指出`Console`类与标准输出的强耦合特性会导致库代码与业务逻辑的依赖混乱——当库被单元测试框架或Web服务器调用时,控制台输出可能完全失效违背依赖倒置原则。通过引入`ILogger`接口抽象层可实现日志系统的解耦,使日志记录与具体输出方式分离。实际应用中可通过`Microsoft.Extensions.Logging`框架构建可扩展的日志体系:通过依赖注入注册日志服务后,开发者可动态切换控制台日志、文件日志或Application Insights等不同输出方式,同时支持日志分级和格式化功能。文章通过代码示例演示了如何通过服务集合配置日志系统,并指出即使不使用依赖注入框架也能通过`LoggerFactory`快速创建控制台日志实例。值得注意的是在终端UI应用或自定义日志实现器等特定场景下,`Console`类仍可作为直接交互工具。那么当你的应用需要同时处理多租户日志时,如何设计日志上下文关联机制?当服务器集群规模扩大时,控制台日志是否仍然能胜任分布式追踪需求?这需要开发者重新思考日志系统的架构设计边界。--Qwen3

C# .NET Core Console App .NET Logging ILogger

Retry with exponetial back-off on C#

本文介绍了一个基于C#实现的指数退避重试引擎设计与实现其核心通过动态计算等待时间在多次失败后自动触发重试机制代码中通过递增的幂次方随机数生成回退间隔时间并结合超时控制与异常过滤策略为开发者提供了灵活的重试解决方案该引擎允许通过when参数自定义重试条件并支持异步任务执行与超时熔断机制在实际应用中开发者可以将其封装到网络请求或分布式任务中以应对临时性故障但如何平衡重试次数与系统负载?当重试策略与业务场景的关联性增强时是否需要引入更智能的决策模型?当异常类型复杂化时如何设计更精准的过滤规则?这些问题都值得在构建可靠系统时深入思考--Qwen3

C# .NET Retry Retry Engine Exponential Backoff Exception Handling

Query Kusto database with C# and get result as List<T>.

该实现通过双缓冲机制和任务调度优化Kusto数据写入性能采用双缓冲策略交替使用_activeBuffer和_secondaryBuffer减少内存占用和数据碎片冷却引擎动态计算写入延迟时间平衡写入频率与数据量大小通过ReaderWriterLockSlim和锁机制实现线程安全的数据入队与缓冲区交换操作引擎任务负责批量写入数据并在缓冲区数据量不足时自动休眠冷却引擎负责在休眠后重新唤醒写入任务形成热状态下的持续写入能力支持高并发场景下的非阻塞数据添加通过CalculateSleepTime方法根据缓冲区数据量动态调整休眠时间避免频繁写入和资源浪费SyncAsync方法确保所有待处理数据最终持久化实现可靠的数据同步机制。--Qwen3

C# .NET Core Azure .NET Kusto Azure Data Explorer KQL

Build a common cache service for your C# app.

这篇文章介绍了如何通过封装Microsoft.Extensions.Caching.Memory库创建一个更简洁的缓存抽象层,重点展示了CacheService类通过策略模式实现的条件缓存机制与选择器模式的结合应用。作者通过封装后的RunCache方法简化了复杂对象的缓存操作,允许开发者通过设置缓存过期时间动态控制数据新鲜度,并通过Selector模式实现缓存数据的转换处理。单元测试示例验证了该方案在不同场景下的行为特征:包括基于缓存条件的动态存储策略、对null值的特殊处理、通过选择器转换数据后的缓存逻辑,以及如何通过设置0分钟缓存时间实现强制刷新。这种设计既保持了原始缓存库的灵活性,又通过策略模式将缓存规则与业务逻辑解耦,为复杂缓存场景提供了可扩展的解决方案。测试用例的覆盖范围暗示着该模式在处理多条件组合缓存场景时的鲁棒性,同时引发思考:是否还有其他维度可以扩展这种缓存策略模式?--Qwen3

ASP.NET Core C# .NET Core Performance Caching .NET Cache MemoryCache