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

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

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

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

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

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

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

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

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

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

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

24
задан NVRAM 11 February 2010 в 20:35
поделиться

2 ответа

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

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

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

14
ответ дан 28 November 2019 в 22:56
поделиться

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

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();
    }
}
6
ответ дан 28 November 2019 в 22:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: