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

StackOverflow https://stackoverflow.com/questions/2234492

Вопрос

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

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

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

  1. (По-видимому) обычный подход к настройке Текущий поток.Текущая культура в качестве первой строки в Главный () но, похоже, он сбрасывается.
  2. Вариация/расширение на http://www.codeproject.com/KB/cs/Change_App_Culture.aspx
  3. Сделайте то же самое (#1) для явно созданных потоков в приложении.

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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 с атрибуция
Не связан с StackOverflow
scroll top