Anduin Xue

let today = new Beginning();

.NET


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

本篇博客主要讲述了如何在C#中启动一个进程并获取其输出。在博客的开始部分,作者分享了一段代码并提出了一个问题:为什么这个测试会一直运行直到超时,而不是正常退出。接着,作者解释了问题的关键在于进程的输出流需要被消耗。如果进程产生了大量的输出,这些输出将会累积在标准输出流中,如果没有程序去读取它,那么这个进程就会陷入无限等待的状态。为了解决这个问题,我们需要不断地读取进程的输出流。 接下来,作者提出了一个修改后的代码,这个代码在等待进程退出的同时,会持续读取进程的输出流。最后,作者通过几个测试案例,验证了修改后的代码的正确性,并且分享了一个可以从Nuget下载的方案。 那么,你是否也遇到过类似的问题?你又是如何解决的呢?这篇博客是否为你提供了一个新的解决方案?如果你对这个话题感兴趣,不妨深入阅读全文,你可能会有更多的收获。--GPT 4

C# git .NET Process

挑选合适尺寸的显示器

本篇博客主要讨论了如何挑选合适尺寸的显示器,以及如何计算显示器的PPI(每英寸像素数量)。文章首先解释了PPI的重要性,它决定了显示器的像素密度,影响着显示的文字大小。为了缓解文字过大或过小的问题,用户往往会使用缩放功能,但非整数倍缩放可能导致非矢量内容产生锯齿。因此,合理的挑选显示器,并合理的使用缩放功能非常重要。 文章接下来详细解释了如何挑选显示器,特别强调了显示器的PPI应尽可能是96的整数倍,以便操作系统使用整数缩放。文章还提供了计算显示器尺寸和PPI的C#代码,以及如何使用这些代码来评估显示器缩放比例。 文章最后通过几个实际的显示器例子,如LG OLED 42C2、Surface Studio 2+和Apple Studio Display等,解释了如何通过计算PPI和尺寸来确定最佳的缩放比例。 这篇文章非常适合那些在挑选显示器时感到困惑,或者对显示器的PPI和尺寸有疑问的读者。你是否曾经因为显示器的文字大小不合适而感到困扰?你是否知道如何计算你的显示器的PPI和尺寸?你的显示器是否使用了最佳的缩放比例?阅读全文,你将找到答案。--GPT 4

C# .NET Display Monitor Resolution

Use your own cert to sign your package to identify your code identity.

This blog post offers a comprehensive guide on using a digital certificate to sign code and establish identity in the digital world. It first explains the concept of digital certificates, which are split into public and private keys. The public key is made available online for others to trust, while the private key is used to sign content. The post further elaborates on the subject and friendly name fields in a digital certificate. The subject field contains identity verification information, while the friendly name is an optional field used for easier identification and management of the certificate. For HTTPS certificates, the subject field typically includes the domain name or hostname of the certificate holder, which is crucial for ensuring secure communication. The blog then provides a step-by-step guide on generating a self-signed certificate and obtaining the private key. It also explains how to make the public key trusted by others. By generating a self-signed certificate and...--GPT 4

C# Certificate .NET Windows Sign Digicert Code Sign Signature nuget

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

本文详细介绍了如何使用GitLab CI/CD管道来展示.NET项目的代码覆盖率和单元测试状态。首先,需要确保在你的GitLab实例中有一个.NET项目。然后,在所有单元测试项目中添加coverlet.collector和JunitXml.TestLogger这两个包。接下来,编写C#代码的单元测试,并创建一个包含构建、测试和发布阶段的.gitlab-ci.yml文件。 在构建阶段,使用dotnet build命令进行编译。在测试阶段,使用dotnet test命令进行测试,并收集代码覆盖率信息。同时,使用reportgenerator生成cobertura格式的报告,并从中提取覆盖率数据。最后,在发布阶段,使用dotnet publish命令进行发布,并将生成的nupkg文件保存为构建产物。 通过这样的配置,你可以在GitLab管道运行结束后查看单元测试结果和代码覆盖率数据。此外,在创建pull request时,还可以看到覆盖率信息。最后,别忘了在Readme.md文件中添加一个代码覆盖率徽章! 本文为你提供了一个完整的示例,帮助你更好地理解如何在GitLab CI/CD管道中展示.NET项目的代码覆盖率和单元测试状态。那么,在你的项目中,如何利用这些技巧来提高代码质量和测试覆盖率呢?--GPT 4

.NET Test Code coverage Continuous Integration GitLab junit YAML

Validate an object in any C# projects

本篇博客详细介绍了如何在C#项目中使用对象验证,以确保输入模型的有效性。文章首先讲解了如何在纯C#环境中使用验证,通过复制一个简单的函数来实现。接着,文章展示了如何在类定义中为属性设置验证规则,如:Required、MinLength和Range等。然后,文章讨论了如何在代码中使用这些验证规则,以及如何根据验证结果输出相应的错误信息。 在某些情况下,系统提供的验证规则可能无法满足特定需求。因此,文章还介绍了如何创建自定义验证属性。例如,验证属性不包含空格或换行符。通过创建一个自定义的验证属性类,我们可以实现这一需求。最后,文章提供了一个完整的示例代码,演示了如何在项目中使用对象验证功能。 在阅读本篇博客后,你是否对C#项目中的对象验证有了更深入的了解?文章中的示例代码是否能帮助你更好地理解如何使用和自定义验证规则?在你的项目中,是否有其他需求需要自定义验证属性来实现?如何利用本文介绍的方法来优化你的项目代码?--GPT 4

ASP.NET Core C# .NET Validation

C# Play with GZip.

本篇博客详细介绍了如何使用C#编写一个扩展类,为字符串添加GZip压缩功能。首先,我们需要将给出的代码复制到项目中。代码包括使用System、System.IO、System.IO.Compression和System.Text命名空间,并定义了一个名为GZipExtensions的静态类。该类包含两个私有静态方法:Zip和Unzip,分别用于压缩和解压字符串。此外,还有两个扩展方法:UnZipBase64和ZipToBase64,它们分别将GZip压缩后的字符串转换为Base64编码,以及将Base64编码的压缩字符串解压缩。 当需要使用这些功能时,只需调用扩展方法即可。博客中提供了一个示例,展示了如何使用ZipToBase64和UnZipBase64方法压缩和解压缩一个字符串,并通过断言验证了压缩和解压缩后的字符串相同,以及压缩后的字符串长度确实减小。 这篇博客为我们提供了一个实用的C#扩展类,用于处理字符串的GZip压缩和解压缩。这种功能在处理大量文本数据时尤为有用,可以帮助我们节省存储空间和网络传输时间。但是,这篇博客还留下了一个有趣的问题:如何进一步优化这个扩展类,以提高压缩和解压缩的性能?这个问题值得我们深入思考和探讨。--GPT 4

C# .NET Compress GZip Base64

Why you should never use `Console.WriteLine`

本文讨论了为什么在编写库代码时应避免使用`Console.WriteLine`,并提供了一些替代方案。使用`Console.WriteLine`会将库与标准输出紧密耦合,并假设调用代码关注标准输出。然而,如果库代码被单元测试套件或使用不同日志记录范例的Web服务器调用,情况将会如何? 根据依赖反转原则,高级模块不应该依赖于低级模块,而应该依赖于抽象(如接口)。此外,抽象不应该依赖于细节,细节(具体实现)应该依赖于抽象。控制台是应用程序依赖的低级模块,而日志记录是与业务相关的高级模块。因此,日志记录不应该依赖于控制台,而应该有一些抽象,如`ILogger`接口,它描述了可以提供日志记录服务的对象。 使用`Console.WriteLine`的原因有以下几点: - 无法确保控制台始终被消费和阅读。 - 需要重建项目以支持更多日志记录服务,如文件、ApplicationInsights、数据库日志记录。 - 应该遵循依赖反转原则,不依赖于低级模块,如`Console.WriteLine`。 - GUI应用程序无效,但可能提供其他日志记录窗口,如输出窗口。 - 控制台日志记录在扩展服务器端应用程序时难以跟踪和诊断。 - 难以为日志设置级别、时间戳和来源。 解决方案包括: - 使用`ILogger`代替`Console` - 使用`ILogger`的各种方法,如`ILogger.LogInformation`、`ILogger.LogCritical`等。 本文还讨论了如何获取实现`ILogger`接口的控制台日志记录器,并提供了相关的代码示例。此外,还介绍了如何在不使用依赖注入的情况下获取日志记录器的最小代码。 最后,本文指出,在某些特定情况下,可以使用`Console`类,例如构建一个终端用户界面应用程序,该应用程序永远不希望标准输出流被重定向到控制台之外的地方,或者在实现支持控制台日志记录的`ILogger`时。--GPT 4

C# .NET Core Console App .NET Logging ILogger

Retry with exponetial back-off on C#

本篇博客介绍了如何在C#中构建一个简单的重试引擎,使用指数退避算法来增加重试间隔。重试引擎的核心功能是在给定任务失败时,根据预设条件进行重试,直到达到最大尝试次数或任务成功完成。 博客中提供了一个RetryEngine类,其主要方法RunWithTry接受一个任务工厂、重试次数、错误处理条件以及超时时间作为参数。在执行任务时,若任务失败并满足重试条件,引擎会根据指数退避算法计算出一个等待时间并在此时间后进行重试。若达到最大尝试次数仍未成功,将抛出异常。 指数退避算法的实现在ExponentialBackoffTimeSlot方法中,通过计算2的次方来获取最大等待时间,并在此范围内随机选择一个时间作为实际等待时间。 在业务代码中,只需创建一个RetryEngine实例并调用RunWithTry方法即可实现任务的重试功能。例如,本文中给出了一个使用重试引擎执行网络请求的示例。 通过本文的介绍,您可以了解如何在C#中实现一个简单的重试引擎,并掌握指数退避算法的基本原理。但在实际应用中,可能还需要根据具体业务需求对重试引擎进行调整。那么,在您的项目中,如何根据实际情况调整重试策略呢?如何在保证任务成功执行的同时,避免过多的重试导致系统资源浪费?期待您的思考和实践。--GPT 4

C# .NET Retry

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

本篇博客介绍了如何在C#中查询Kusto(Azure数据资源管理器)并获得强类型结果。首先,需要安装Kusto客户端,然后构建一个抽象类作为Kusto响应行。接下来,创建一个名为“KustoRepository”的新类,并在其构造函数中构建一个新的KustoClient。为了获取应用ID和应用密钥,需要在Azure AD中注册应用并允许其访问Kusto客户端。然后构建查询函数,该函数将查询结果转换为强类型的列表。 建议将查询函数与缓存服务、重试引擎和`Task.Run()`进行包装,以提高性能、可靠性和代码风格。最后,在需要使用查询功能时,只需创建一个具有预期响应行类型的新类,然后使用查询函数即可。 本文提供了一个详细的示例,包括创建抽象类、KustoRepository类和查询函数的实现。通过阅读本文,读者可以了解如何在C#中实现对Kusto数据库的查询,并将查询结果转换为强类型数据。这种方法可以提高代码的可读性和可维护性,同时也可以方便地扩展到其他类型的查询。请问这种方法在实际项目中的应用有哪些优势?如何根据实际需求调整查询函数以满足不同场景的需求?--GPT 4

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

Build a common cache service for your C# app.

本篇博客介绍了如何为C#应用程序构建一个通用的缓存服务。文章详细讲解了如何使用CacheService类实现缓存功能,以及如何通过QueryCacheWithSelector方法进行缓存查询。同时,博客还提供了一系列测试用例来展示该缓存服务在不同场景下的表现。 在阅读本文后,你将了解到如何利用C#中的CacheService类实现缓存功能,以提高应用程序的性能。文章还探讨了如何利用选择器(selector)来实现更灵活的缓存策略,以及如何通过条件参数来控制缓存的行为。此外,博客还探讨了如何处理空值和缓存失效的情况。 那么,在构建C#应用程序时,如何确保缓存服务的高效运行?如何根据不同场景选择合适的缓存策略?如何在保证性能的同时,确保数据的准确性和实时性?阅读本文,你将找到答案。--GPT 4

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

Display code coverage information for .NET Core project using Azure DevOps.

本文介绍了如何在.NET Core项目中使用Azure DevOps显示代码覆盖率信息。首先,需要在Azure DevOps中创建一个构建管道。对于使用经典设计器的用户,需要添加一个新的.NET Core命令行步骤,并确保发布测试结果。在参数输入中,插入:--configuration $(buildConfiguration) --collect "Code coverage"。对于使用YAML的用户,添加任务:DotNetCoreCLI@2,并使用相应的输入参数。 请注意,始终使用Windows平台运行构建,不要在Linux上运行,因为代码覆盖率生成器尚不支持Linux。保存并运行管道后,可以在构建完成时查看代码覆盖率和测试结果。在本文的示例中,代码覆盖率为87%。 要获取徽章URL,首先复制URL中的以下部分。复制URL的三个部分,如示例中的A、B和C。然后复制以下markdown文本:![Azure DevOps coverage](https://img.shields.io/azure-devops/coverage/{{A}}/{{B}}/{{C}})。将A、B和C更改为复制的值,如:![Azure DevOps coverage](https://img.shields.io/azure-devops/coverage/aiursoft/Star/5)。将其保存在readme.md中。 完成上述步骤后,即可在.NET Core项目中显示代码覆盖率信息。这样的功能对于开发者来说,无疑是一个很好的辅助工具,可以更好地了解代码的覆盖情况,提高代码质量。那么,如何更好地提高代码覆盖率呢?这将是一个值得思考的问题。--GPT 4

.NET Core Azure DevOps .NET Test MSTest Integration Test Code coverage GitHub

How to serialize JSON object in C# without Newtonsoft Json

本篇博客介绍了如何在C#中不使用Newtonsoft.Json库进行JSON对象的序列化和反序列化。在某些情况下,我们可能无法访问`Newtonsoft.Json`包,例如当不同的包使用不同版本的库时,可能会导致构建过程中的版本冲突。这通常发生在一些非常大的项目中。 本文提供了一个名为`MyJsonConverter`的静态类,其中包含两个方法:`Serialize`用于将对象序列化为JSON字符串,`Deserialize`用于将JSON字符串反序列化为对象。这个类使用了`System.Runtime.Serialization.Json`命名空间中的`DataContractJsonSerializer`类来实现序列化和反序列化。 通过这个类,我们可以像使用`Newtonsoft.Json`一样简单地进行JSON操作。示例代码创建了一个名为`Book`的简单类,并使用`MyJsonConverter`将其序列化为JSON字符串,然后将该字符串反序列化为`Book`对象。运行结果显示序列化和反序列化均成功。 这篇博客提供了一个在不依赖`Newtonsoft.Json`的情况下进行JSON操作的替代方案。那么,在实际项目中,我们是否应该放弃使用`Newtonsoft.Json`呢?这个问题值得我们深入思考。--GPT 4

C# JSON .NET Newtonsoft.Json

  • 1