Изменить культуру потоков .NET Framework 4.6 и более поздние версии - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь изменить новую тему CultureInfo, как показано ниже, но:

  • Попытка1: SetCulture1 () не меняет мою ветку
  • Попытка2: SetCulture2 () Я получил исключение «System.InvalidOperationException: экземпляр только для чтения» (при установке 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?

Спасибо!

1 Ответ

0 голосов
/ 13 ноября 2018

Хотя на эту странную ситуацию нет ответа ( Отчет об ошибке Microsoft ), я нашел способ обойти настройку DefaultThreadCurrentCulture в начале моего кода (метод Main):

        var ci = new System.Globalization.CultureInfo(System.Globalization.CultureInfo.CurrentCulture.LCID);
        ci.NumberFormat.CurrencyDecimalSeparator = ".";
        ci.NumberFormat.CurrencyGroupSeparator = ",";
        ci.NumberFormat.NumberDecimalSeparator = ".";
        ci.NumberFormat.NumberGroupSeparator = ",";
        ci.NumberFormat.PercentDecimalSeparator = ".";
        ci.NumberFormat.PercentGroupSeparator = ",";
        System.Globalization.CultureInfo.DefaultThreadCurrentCulture = ci;
        System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = ci;
...