HINWEIS: datiertes Material, müssen Sie die Aktualisierung an der Unterseite für Änderungen in .NET 4.6
Ja zu lesen, ist dies ein weit verbreitete Anfrage, aber es ist nicht verfügbar. Windows initialisiert einen Betriebssystemthread immer mit der Standard-LCID des Systems, die im Applet "Regions- und Sprachoptionen" in der Systemsteuerung konfiguriert wurde. Sie können dies außer Kraft setzen, solange Sie die Threads selbst erstellen. Aber das ist nicht praktisch für Threadpool-Threads und Threads, die möglicherweise von einer Art nicht verwaltetem Code erstellt wurden, der Ihren Prozess ausführt, wie ein COM-Server.
Der letztere Fall ist das Problem. .NET hat keine Probleme, verwalteten Code in Threads auszuführen, die mit nicht verwaltetem Code erstellt wurden. Aber es kann nichts über die Art und Weise tun, wie der Thread initialisiert wird. Das gilt für CurrentUICulture, aber auch für etwas obskureres wie Thread.SetApartmentState(). Unterschätzen Sie nicht die Wahrscheinlichkeit, dass ein solcher Thread Code in Ihrem Programm ausführt, COM-Server, die von Microsoft geschrieben wurden, sind sehr Thread-glücklich.
Sie müssen durch Ihren Code mit einem feinzackigen Kamm gießen und finden Sie Code, der auf einem Thread ausgeführt werden könnte, den Sie nicht erstellt haben. Jeder Event-Handler ist verdächtig, ebenso wie jede BeginXxx() -Methode, die einen Callback hat. BackgroundWorker ist definitiv das kleinere Problem.
Nicht überschreiben die Kultur des Threads kann produzieren sehr subtile und schwer zu diagnostizieren Bugz. Ein gutes Beispiel wäre eine SortedList, die auf eine Zeichenfolge eingibt. Wenn es mit der falschen Kultur ausgeführt wird, findet es zufällig keine Elemente, die tatsächlich in der Liste vorhanden sind. Dadurch, dass die Liste nicht mehr in einer anderen Kultur mit anderen Sortierregeln sortiert ist.
Wenn ich Sie genug erschrecken konnte, dann habe ich meine Nachricht über. Dies ist mir passiert, als ich ein Problem mit einem sehr großen Programm, das sich auf einer dänischen Maschine verharmlost hat, debuggte. Wir hatten keine dänische Lokalisierung und zwangen die Benutzeroberfläche, in Englisch zu laufen. Ein Worker-Thread verwendete einen rot-schwarzen Baum, der eine Zeichenfolge als Schlüssel hatte. Es scheiterte nach dem Zufallsprinzip, als sie gebeten wurde, sich mit Åårdvårks zu befassen. Nahm mich eine Woche.
Update: Dieses Problem wurde in .NET 4.5 behoben. Die CultureInfo-Klasse verfügt jetzt über DefaultThreadCurrentCulture und DefaultThreadCurrentUICulture. Wenn diese Option festgelegt ist, wird sie verwendet, um die Kultur eines verwalteten Threads anstelle der Standard-Windows-Systemkultur zu initialisieren.Wie es mit Threads interagiert, die durch nativen Code gestartet wurden und verwalteten Code eingeben, ist mir noch nicht klar.
Update: Dieses Problem hatte eine gründlichere Lösung in .NET 4.6. Kultur fließt jetzt automatisch, das ideale Verhalten. Der MSDN-Artikel für CultureInfo.CurrentCulture() spricht darüber. Die bereitgestellten Informationen sind noch verwirrend, experimentell scheint sie auch zu einem Thread-Objekt zu fließen und nicht nur zu einem Task- oder Threadpool-Thread und DefaultThreadCurrentCulture wird nicht verwendet. Zwei Schritte vorwärts, ein Schritt zurück, Testen wird empfohlen.