【发布时间】:2018-06-23 22:43:31
【问题描述】:
我正在尝试更改一个新线程 CultureInfo,如下面的示例,但是:
- Attempt1:
SetCulture1()没有更改我的线程 -
Attempt2:
SetCulture2()我收到异常“System.InvalidOperationException: instance is read-only”(设置 CurrencyDecimalSeparator 时)static void Main(string[] args) { Thread th = new Thread(thread_test); // nothing happens SetCulture1(th); // exception System.InvalidOperationException: instance is read-only SetCulture2(th); th.Start(); } public static void SetCulture1(System.Threading.Thread thread) { var ci = new System.Globalization.CultureInfo("pt-BR"); ci.NumberFormat.CurrencyDecimalSeparator = "."; thread.CurrentCulture = ci; // <-- after this culture info not change if (thread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator != ".") { Console.WriteLine("Nothing happened"); Console.ReadKey(); } } public static void SetCulture2(System.Threading.Thread thread) { thread.CurrentCulture = new System.Globalization.CultureInfo("pt-BR"); thread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator = "."; // <-- exception throws here } static void thread_test() { Console.WriteLine("Culture: {0}", CultureInfo.CurrentCulture.DisplayName); }
我注意到,在 .net 4.6 之前,此示例有效。 4.6 有什么变化吗?
谢谢!
【问题讨论】:
-
设置ci后,CurrencyDecimalSeparator不是“.”
-
你是对的 - 它似乎是 4.6 以后的回归。设置它确实有效(即它已经覆盖了线程内的文化)但
getting 在setting 之后它返回旧值。很奇怪。你应该microsoft.com/net/support/report-a-bug . -
无法在我这边重现(.net 4.7.1)
-
@KevinGosse 您是否生活在小数点分隔符为
.的文化中?如果是这样,是的,那么Nothing happened将不会显示。您需要将.s 调整为,s。
标签: c# .net multithreading cultureinfo