2010-02-10 14 views
21

J'ai une application écrite en C# qui n'a pas d'interface graphique ou d'interface utilisateur, mais écrit à la place des fichiers qui sont analysés par une autre application (en XML et autres).Est-il possible de définir CultureInfo pour une application .NET ou simplement un thread?

J'ai un client dont CultureInfo a défini le paramètre NumberDecimalSeparator sur une virgule, ce qui provoque des erreurs d'analyse avec des nombres à virgule flottante (PI finirait par 3,1415).

Je voudrais un moyen de définir globalement le CultureInfo dans l'application, pour tous les threads. J'ai essayé:

  1. Le (apparemment) approche habituelle de la mise en CurrentThread.CurrentCulture comme la première ligne principal() mais il semble se réinitialiser.
  2. Une variation/expansion sur http://www.codeproject.com/KB/cs/Change_App_Culture.aspx
  3. Faites de même (# 1) sur les threads explicitement créés dans l'application.

Il n'est pas possible d'utiliser la mise en forme explicite (150K + lignes, la plupart écrites par d'anciens employés). [Modifier] L'application se lie à un socket et gère les requêtes des clients dédiés. Selon le type de requête, il engendre différentes classes de gestionnaire.

Désolé, lors de ma première publication j'aurais dû clarifier en # 1 que (je pensais à) Je l'avais fait dans tous les gestionnaires qui étaient explicitement engendrés, aussi.

Il se trouve que j'ai raté le fil/gestionnaire qui était à l'origine du problème. Donc l'application fonctionne correctement maintenant, mais la question reste à savoir si la culture peut être définie sur tous les threads.

S'il pouvait itérer sur tous les threads, cela résoudrait également le problème. Alors:

Comment puis-je obtenir tous les objets discussion (non ProcessThread) dans le processus en cours?

Répondre

13

Malheureusement, chaque nouveau thread commence par l'information locale du système , même si elle a démarré à partir d'un thread dont les paramètres régionaux ont été modifiés.

Ce fut un énorme Gotcha je suis tombé dans l'une de nos applications lorsque vous utilisez un BackgroundWorker pour charger un fichier.

L'approche que je l'ai utilisé avec succès est définir les paramètres régionaux sur le fil de démarrage, puis utilisez une usine de fil pour créer des threads avec la « locale de l'application. » Pour BackgroundWorkers, vous pouvez utiliser une classe d'usine ou une classe dérivée, car Thread est scellé alors que BackgroundWorker ne l'est pas.

+6

Contribue seulement si vous êtes dans le contrôle de la création de fil. Parfois, vous devez gérer les threads créés par .NET. Il ne faut jamais oublier la ligne sacrée ** 'System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo (" FR-US ");' ** – Bitterblue

6

Je ne pense pas que vous pouvez définir la culture pour l'ensemble de l'application, mais vous pouvez définir les explicilty de culture à chaque fois que vous créez un fil:

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

Dans 4.5 .NET, vous pouvez utiliser CultureInfo.DefaultThreadCurrentCulture