Можно ли установить CultureInfo для .NET-приложения или просто потока?
-
19-09-2019 - |
Вопрос
У меня есть приложение, написанное на C #, которое не имеет графического интерфейса, но вместо этого записывает файлы, которые анализируются другим приложением (в формате XML и других).
У меня есть клиент, у которого CultureInfo имеет параметр NumberDecimalSeparator, равный запятой, что вызывает ошибки синтаксического анализа с числами с плавающей запятой (PI в конечном итоге будет иметь вид 3,1415).
Мне бы нужен способ установить CultureInfo глобально внутри приложения для всех потоков.Я пытался:
- (По-видимому) обычный подход к настройке Текущий поток.Текущая культура в качестве первой строки в Главный () но, похоже, он сбрасывается.
- Вариация/расширение на http://www.codeproject.com/KB/cs/Change_App_Culture.aspx
- Сделайте то же самое (#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");