.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
相关产品推荐
相关产品推荐

