You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core调用Encoding.GetEncoding()无限挂起问题求助

解决Encoding.GetEncoding(1251)/Windows-1251调用时无限挂起的问题

我之前在.NET Core 2.1早期版本里碰到过一模一样的问题,结合你给出的环境配置(VS2017 15.7.2、dotnet 2.1.201、Windows10),这是该版本里编码加载逻辑的已知死锁问题,以下是可行的解决办法:

1. 优先升级.NET Core版本

这个死锁问题在**.NET Core 2.1.4及以后的补丁版本**里已经被官方修复了。你可以:

  • 升级全局的.NET Core SDK到2.1系列的最新补丁版本,或者直接迁移到更高的LTS版本(比如3.1、6.0,这些版本的稳定性更好)
  • 修改项目文件中的SDK版本,确保项目使用修复后的版本编译运行

2. 临时绕过方案(如果暂时无法升级)

如果因为项目限制不能马上升级SDK,可以尝试在程序启动时预加载编码,并且确保在单线程上下文完成加载,避免后续多线程触发死锁:

using System.Text;

namespace YourAppNamespace
{
    class Program
    {
        static void Main(string[] args)
        {
            // 先注册编码提供器,.NET Core默认不包含所有Windows编码
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            // 预加载1251编码,后续调用就不会触发加载逻辑
            var _ = Encoding.GetEncoding(1251);
            
            // 这里开始你的业务逻辑
        }
    }
}

这么做的原因是:早期.NET Core加载非默认编码时,内部线程同步机制存在缺陷,多线程同时触发加载会导致死锁;预加载后,后续调用会直接使用已加载的编码实例,避免了死锁场景。

内容的提问来源于stack exchange,提问作者f0rt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:15:14