GUIやUIを持たないC#で記述されたアプリケーションがありますが、代わりに別のアプリケーション(XMLなど)によって解析されるファイルを書き込みます。
CultureInfoのNumberDecimalSeparatorがコンマに設定されている顧客がいます。これにより、浮動小数点数で解析エラーが発生します(PIは3,1415として終了します) 。
すべてのスレッドについて、アプリケーション内でCultureInfoをグローバルに設定する方法が必要です。私はもう試した:
また、明示的なフォーマットを使用するように変更することはできません(15万行以上、ほとんどが元従業員によって書かれています)。
[編集]アプリケーションはソケットにバインドし、専用クライアントからの要求を処理します。リクエストタイプに応じて、異なるハンドラークラスを生成します。
申し訳ありませんが、最初に投稿したとき、#1で、(私は)明示的に生成されたすべてのハンドラーでもこれを行ったことを明確にする必要がありました。
問題の原因となっているスレッド/ハンドラーを見逃したことが判明しました。アプリケーションは正常に動作していますが、カルチャをすべてのスレッドに設定できるかどうかについては疑問が残ります。 。
すべてのスレッドを反復処理できれば、問題も解決します。そう:
現在のプロセスのすべてのThreadオブジェクト(ProcessThreadではない)を取得するにはどうすればよいですか?
残念ながら、新しいスレッドはすべて、ロケールが別のスレッドに変更されたスレッドから開始された場合でも、システムロケール情報で開始されます。
これは、BackgroundWorker
を使用してファイルをロードするときにアプリの1つで遭遇した大きな落とし穴でした。
私がうまく使用したアプローチは、起動スレッドにロケールを設定してから、スレッドファクトリを使用して「アプリケーションロケール」でスレッドを作成することです。 BackgroundWorkersの場合、Thread
は封印されていますが、BackgroundWorker
は封印されていないため、ファクトリまたは派生クラスのいずれかを使用できます。
.NET 4.5では、CultureInfo.DefaultThreadCurrentCultureを使用できます。
アプリケーション全体のカルチャを設定できるとは思いませんが、スレッドを作成するたびにカルチャの明示性を設定できます。
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");