Подтвердить что ты не робот

Можно ли установить приложение CultureInfo для приложения .NET или просто поток?

У меня есть приложение, написанное на С#, которое не имеет графического интерфейса или пользовательского интерфейса, но вместо этого записывает файлы, которые анализируются другим приложением (в XML и других).

У меня есть клиент, у которого CultureInfo имеет NumberDecimalSeparator, установленный в запятую, что приводит к ошибкам синтаксического анализа с номерами с плавающей запятой (PI будет заканчиваться как 3,1415).

Мне нужен способ установить CultureInfo глобально в приложении для всех потоков. Я пробовал:

  • Обычный (обычно) подход CurrentThread.CurrentCulture как первая строка в Main(), но, похоже, он получает reset.
  • Вариант/расширение на http://www.codeproject.com/KB/cs/Change_App_Culture.aspx
  • Сделайте то же самое (# 1) в явно созданных потоках в приложении.

И изменение использования явного форматирования не является вариантом (150K + строк, большинство из которых написаны бывшими сотрудниками).

[изменить] Приложение привязывается к сокету и обрабатывает запросы от выделенных клиентов. В зависимости от типа запроса он порождает разные классы обработчиков.

Извините, когда я впервые разместил сообщение, я должен был уточнить в № 1, что (хотя) я сделал это во всех обработчиках, которые также были явно порождены.

Оказывается, я пропустил поток/обработчик, который вызывал проблему. Таким образом, приложение работает правильно, но остается вопрос, можно ли установить культуру для всех потоков.

Если бы он мог перебирать все потоки, это тоже решило бы проблему. Итак:

Как я могу получить все объекты Thread (не ProcessThread) в текущем процессе?

4b9b3361

Ответ 1

К сожалению, каждый новый поток начинается с информации о языковой системе системы, даже если она началась с потока, у которого его локаль изменилась на что-то еще.

Это была огромная проблема, с которой я столкнулся в одном из наших приложений при использовании BackgroundWorker для загрузки файла.

Подход, который я использовал успешно, - это установить локаль в потоке запуска, а затем использовать поток factory для создания потоков с "локалью приложения". Для BackgroundWorkers вы можете использовать либо factory, либо производный класс, поскольку Thread запечатан, а BackgroundWorker - нет.

Ответ 2

В .NET 4.5 вы можете использовать CultureInfo.DefaultThreadCurrentCulture

Ответ 3

Я не думаю, что вы можете установить культуру для всего приложения, но вы можете установить культуру, объясняющую всякий раз, когда вы создаете поток:

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();
    }
}

Ответ 4

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");