Frage

Ich habe eine Anwendung in C # geschrieben, die keine GUI oder UI haben, sondern schreibt Dateien, die von einer anderen Anwendung analysiert werden (in XML und anderen).

Ich habe einen Kunden, dessen Culture hat den NumberDecimalSeparator Satz ein Komma, die Fehler mit Gleitkommazahlen verursacht Parsen (PI würde am Ende als 3,1415 ).

würde ich einen Weg, wie die Culture global innerhalb der Anwendung zu setzen, für alle Threads. Ich habe versucht:

  1. Der (scheinbar) üblicher Ansatz der Einstellung CurrentThread.CurrentCulture als die erste Zeile in Main () aber es scheint, zurückgesetzt zu erhalten.
  2. Eine Variation / Expansion auf http://www.codeproject.com/KB/cs /Change_App_Culture.aspx
  3. Machen Sie dasselbe (# 1) auf die explizit erstellt Threads in der Anwendung.

Und Ändern explizite Formatierung zu verwenden, ist keine Option (150K + Linien, die meisten von ehemaligen Mitarbeitern geschrieben).

[Bearbeiten] Die Anwendung bindet an eine Steckdose und Griffe Anfragen von engagierten Kunden. Je nach Anforderungstyp laicht es verschiedene Handler-Klassen.

Sorry, wenn ich gepostet zuerst sollte ich in 1 # geklärt haben, dass ( Ich obwohl ) ich dies getan hatte, in all den Handler, die explizit hervorgebracht wurden, zu.

Es stellt sich heraus, dass ich den Thread / Handler verpasst, die das Problem verursacht wurde. So ist die Anwendung jetzt richtig funktioniert, aber es bleibt die Frage zu, ob die Kultur auf allen Threads festgelegt werden.

Wenn es über alle Threads laufen könnte, würde es das Problem, lösen. Also:

Wie kann ich alle Thema Objekte (nicht Process ) im aktuellen Prozess?

War es hilfreich?

Lösung

Leider all neuer Thread beginnt mit System Locale-Informationen, auch wenn es von einem Thread gestartet hat, dass das hatte seine locale auf etwas anderes geändert.

Das war ein großer Gotcha Ich lief in in einem unserer Anwendungen, wenn eine BackgroundWorker mit einer Datei zu laden.

Der Ansatz, den ich erfolgreich eingesetzt habe, ist das Gebietsschema auf dem Start Thread zu setzen, und dann ein Gewinde Fabrik verwendet Threads mit dem schaffen „Anwendung locale.“ Für BackgroundWorkers können Sie entweder eine Fabrik oder eine abgeleitete Klasse verwenden, wie Thread abgedichtet wird, während BackgroundWorker nicht.

Andere Tipps

In .NET 4.5 können Sie CultureInfo.DefaultThreadCurrentCulture verwenden

Ich glaube nicht, dass Sie die Kultur für die gesamte Anwendung einstellen können, aber Sie können die Kultur explicilty gesetzt, wenn Sie einen Thread zu erstellen:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top