2010-02-10 4 views
21

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

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

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

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

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

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

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

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

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

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

ответ

13

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

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

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

+6

Помогает только если вы контролируете создания потока. Иногда вам приходится иметь дело с потоками, созданными .NET. Никогда не следует забывать о святой линии ** «System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo (« EN-US »); ** – Bitterblue

6

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

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

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

26

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