Мне записали приложение в C#, который не имеет никакого GUI или UI, но вместо этого пишет файлы, которые анализируются другим приложением (в XML и других).
У меня есть клиент, CultureInfo которого установили NumberDecimalSeparator на запятую, которая вызывает ошибки анализа с числами с плавающей точкой (PI закончился бы как 3,1415).
Я хотел бы способ установить CultureInfo глобально в рамках приложения для всех потоков. Я попробовал:
И изменяясь на использование явное форматирование не является опцией (150K + строки, самые записанные бывшими сотрудниками).
[Редактируют] приложение, связывает с сокетом и обрабатывает запросы от преданных клиентов. В зависимости от типа запроса это порождает различные классы обработчика.
Извините, когда я сначала отправил, я должен был разъяснить в № 1, что (я, хотя) сделал это во всех обработчиках, которые были явно порождены, также.
Оказывается, что я пропустил поток/обработчик, который вызывал проблему. Таким образом, приложение работает правильно теперь, но вопрос остается о том, если культура может быть установлена на всех потоках.
Если бы это могло бы выполнить итерации по всем потокам, это решило бы проблему, также. Так:
Как я могу получить все объекты Потока (не ProcessThread) в текущем процессе?
К сожалению, каждый новый поток начинается с информации о языковом стандарте системы, даже если он запущен из потока, языковой стандарт которого был изменен на что-то другое.
Это была огромная ошибка, с которой я столкнулся в одном из наших приложений при использовании BackgroundWorker
для загрузки файла.
Подход, который я успешно использовал, состоит в том, чтобы установить языковой стандарт в потоке запуска, а затем использовать фабрику потоков для создания потоков с «языковым стандартом приложения». Для BackgroundWorkers вы можете использовать фабрику или производный класс, поскольку Thread
запечатан, а BackgroundWorker
- нет.
Я не думаю, что вы можете установить культуру для всего приложения, но вы можете явно указать культуру всякий раз, когда создаете поток:
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();
}
}