[英]How to set the value of main thread's CultureInfo.CurrentUICulture from a child thread in .NET Core 3.1?
[英]Is it possible to set the CultureInfo for an .NET application or just a thread?
我有一个用C#编写的应用程序,它没有GUI或UI,但是写的是由另一个应用程序(以XML和其他形式)解析的文件。
我有一个客户,其CultureInfo将NumberDecimalSeparator设置为逗号,这会导致解析带有浮点数的错误(PI最终为3,1415 )。
我想为所有线程在应用程序中全局设置CultureInfo的方法。 我试过了:
更改为使用显式格式不是一个选择(超过15万行,大多数由前员工编写)。
[编辑]该应用程序绑定到套接字并处理来自专用客户端的请求。 根据请求类型,它产生不同的处理程序类。
抱歉,当我第一次发布时,我应该在#1中阐明( 我虽然 ), 但我也已经在所有显式产生的处理程序中做到了这一点。
原来,我错过了导致问题的线程/处理程序。 因此,应用程序现在可以正常工作,但是问题仍然在于是否可以在所有线程上设置区域性。
如果它可以遍历所有线程,那么它也将解决该问题。 所以:
如何获取当前进程中的所有Thread对象(不是ProcessThread )?
在.NET 4.5中,您可以使用CultureInfo.DefaultThreadCurrentCulture
不幸的是,每个新线程都以系统语言环境信息开头,即使它是从已将其语言环境更改为其他内容的线程开始的。
使用BackgroundWorker
加载文件时,这是我遇到的一个巨大难题。
我成功使用的方法是在启动线程上设置语言环境,然后使用线程工厂通过“应用程序语言环境”创建线程。 对于BackgroundWorkers,您可以使用工厂或派生类,因为Thread
是密封的,而BackgroundWorker
不是。
我认为您不能为整个应用程序设置区域性,但是只要创建线程,就可以设置区域性公开性:
using System;
using System.Globalization;
using System.Threading;
class Program {
static void thread_test() {
Console.WriteLine("Culture: {0}", CultureInfo.CurrentCulture.DisplayName);
}
public static void Main(params string[] args) {
Thread t = new Thread(thread_test);
t.CurrentCulture = new CultureInfo("it-it");
t.Start();
t.Join();
}
}
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.