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:

  1. A (aparentemente) abordagem habitual de configuração CurrentThread.CurrentCulture como a primeira linha no Main () , mas parece para obter reiniciado.
  2. Uma variação / expansão no http://www.codeproject.com/KB/cs /Change_App_Culture.aspx
  3. 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?

Foi útil?

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");

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top