É possível definir o CultureInfo para uma aplicação .NET ou apenas um fio?
-
19-09-2019 - |
Pergunta
Eu tenho um aplicativo escrito em C # que não tem GUI ou interface do usuário, mas em vez disso grava arquivos que são analisados ??por outro aplicativo (em XML e outros).
Eu tenho um cliente cujo CultureInfo tem o conjunto NumberDecimalSeparator para uma vírgula, o que causa erros de análise com números de ponto flutuante (PI iria acabar como 3,1415 ).
Eu gostaria de uma maneira de definir o CultureInfo globalmente dentro do aplicativo, para todos os tópicos. Eu tentei:
- A (aparentemente) abordagem habitual de configuração CurrentThread.CurrentCulture como a primeira linha no Main () , mas parece para obter reiniciado.
- Uma variação / expansão no http://www.codeproject.com/KB/cs /Change_App_Culture.aspx
- Faça o mesmo (# 1) nas roscas explicitamente criado no aplicativo.
E mudando de usar formatação explícita não é uma opção (150K linhas +, a maioria escritos por ex-funcionários).
[Edit] Os vínculos de aplicação a uma tomada e lida com pedidos de clientes dedicados. Dependendo do tipo de pedido que ela gera diferentes classes de manipulador.
Infelizmente, quando eu postei primeiro eu deveria ter esclarecido no nº 1 que ( I embora ) eu tinha feito isso em todos os manipuladores que foram explicitamente gerados também.
Acontece que eu perdi o fio / manipulador que estava causando o problema. Então, o aplicativo está funcionando corretamente agora, mas a questão permanece sobre se a cultura pode ser definida em todos os tópicos.
Se pudesse interagir sobre os tópicos, que iria resolver o problema, também. Assim:
Como posso obter tudo Tópico objetos (não ProcessThread ) no processo atual?
Solução
Infelizmente, a cada novo fio começa com informações localidade do sistema, mesmo que seja iniciados a partir de um segmento que teve seu local alterado para algo mais.
Este foi um enorme pegadinha eu corri para em um de nossos aplicativos quando se utiliza um BackgroundWorker
para carregar um arquivo.
A abordagem que eu usei com sucesso é definir a localidade no segmento de inicialização, e então usar uma fábrica de fio para criar tópicos com o "locale aplicação." Para BackgroundWorkers você pode usar qualquer uma fábrica ou uma classe derivada, como Thread
é selado enquanto BackgroundWorker
não é.
Outras dicas
Em .NET 4.5 você pode usar CultureInfo.DefaultThreadCurrentCulture
Eu não acho que você pode definir a cultura para toda a aplicação, mas você pode definir o explicilty cultura sempre que você criar um fio:
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");