Evento de criação de threads para definir o CurrentCulture
-
23-08-2019 - |
Pergunta
Nosso aplicativo permite que o usuário altere a cultura em que a executa e que a cultura pode ser diferente da cultura subjacente do sistema operacional. A única maneira que eu encontrei sobre isso é definir o thread.currentThread.currentculture and thread.currentThread.currentuiculture para cada thread.
O único problema com isso é que devemos definir a cultura para cada thread e precisamos lembrar de fazer isso sempre que criarmos um novo thread. Se você definir um segmento para outra cultura, criar um novo thread, ele obtém a cultura do sistema operacional, não do thread que o criou.
Eu gostaria de encontrar uma maneira melhor de fazer isso. Só consigo pensar em duas coisas, mas não sei se são possíveis.
- Defina a cultura no nível do aplicativo para que todos os threads padrão para essa cultura. Isso é possível?
- Existe um evento de criação de threads em qualquer lugar que eu possa me inscrever? Dessa forma, posso configurar um manipulador para definir a cultura na criação de threads.
Quaisquer idéias ou ajuda seriam bem -vindas, mesmo que eu precise prender a API Win32. Desde já, obrigado.
EDITAR: eu encontrei essa questão o que é semelhante, mas nenhuma resposta foi encontrada.
Solução 3
Duas novas propriedades foram adicionadas à classe CultureInfo no .NET 4.5, que resolve esse problema, DefaultThreadCurrentCulture e DefaultThreadCurrentuiculture.
Agora você pode definir essas duas propriedades e todos os novos threads serão definidos para a cultura padrão em vez da cultura do sistema. Essas propriedades também definirão a cultura para todos os tópicos existentes que não têm explicitamente seu conjunto de cultura.
Outras dicas
Pode não ser a solução exata, mas que tal criar uma classe responsável pela sua criação de threads?
class MyThreadFactory
{
public static Thread getThread()
{
Thread a = new Thread(..);
a.CurrentCulture = xxxx;
return a;
}
}
Uso:
Thread newThread = MyThreadFactory.getThread();
- Você pode colocar toda a sua lógica de cultura e arquivos de recursos estáticos na camada de interface do usuário/apresentação e apenas se preocupar com a cultura do encadeamento da interface do usuário (assumindo o aplicativo de desktop aqui). Isso incluiria quaisquer traduções que estejam em arquivos de recursos, qualquer formatação específica da cultura, etc.
- Se a primeira ideia não puder ser implementada, você poderá criar uma classe de thread auxiliar que define a cultura para você quando os threads de longa data são criados. Você também precisará definir a cultura de todos os threads de threads.
A cultura é um conceito específico de threads no Windows, e os threads no Windows são realmente agnósticos de um processo ou aplicativo. Não há nível de abstração entre um encadeamento e o sistema operacional que contém informações de cultura (que eu conheço), então você deve defini -lo em cada thread.
Apenas para adicionar a resposta @ROB Prouse. Aqui está uma demonstração rápida.
Definindo a cultura na intialização do aplicativo:
if(CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol != "N$") { CultureInfo customCulture = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name); customCulture.NumberFormat.CurrencySymbol = "N$"; CultureInfo.DefaultThreadCurrentCulture = customCulture; CultureInfo.DefaultThreadCurrentUICulture = customCulture; }
Usando as informações da cultura no meu .ToString ().
.ToString("C", CultureInfo.DefaultThreadCurrentCulture)