Question

J'ai une demande écrite en C # qui n'a pas d'interface graphique ou l'interface utilisateur, mais écrit à la place des fichiers qui sont analysées par une autre application (en XML et autres).

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

Je voudrais une façon de régler le CultureInfo globalement dans l'application, pour tous les threads. J'ai essayé:

  1. (apparemment) approche habituelle de réglage CurrentThread.CurrentCulture comme la première ligne Main () mais il semble se réinitialiser.
  2. Une modification / extension sur http://www.codeproject.com/KB/cs /Change_App_Culture.aspx
  3. Faites la même chose (# 1) sur les fils explicitement créés dans l'application.

Et le changement d'utiliser la mise en forme explicite est pas une option (150K + lignes, la plupart écrits par d'anciens employés).

[Modifier] L'application se lie à une prise de courant et traite les demandes des clients spécifiques. En fonction du type de demande, il engendre différentes classes de traitement.

Désolé, quand je posté je aurais dû préciser dans # 1 que ( Je croyais que ) Je l'avais fait cela dans tous les gestionnaires qui ont été explicitement ont donné naissance 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-il si la culture peut être définie sur tous les sujets.

Si l'on pouvait itérer sur toutes les discussions, il résoudrait la question aussi. Donc:

Comment puis-je obtenir tous les Discussion objets (pas ProcessThread ) dans le processus actuel?

Était-ce utile?

La solution

Malheureusement, chaque nouveau thread commence par l'information locale du système, même si elle est commencé à partir d'un fil qui a eu son environnement local a changé à autre chose.

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 usine ou une classe dérivée, comme Thread est scellé alors que BackgroundWorker n'est pas.

Autres conseils

Dans .NET 4.5, vous pouvez utiliser CultureInfo.DefaultThreadCurrentCulture

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top