.NET アプリケーションまたは単なるスレッドに対して CultureInfo を設定することは可能ですか?
-
19-09-2019 - |
質問
C# で書かれたアプリケーションがありますが、これには GUI や UI がなく、代わりに別のアプリケーションによって解析されるファイル (XML など) が書き込まれます。
CultureInfo の NumberDecimalSeparator がカンマに設定されている顧客がいます。これにより、浮動小数点数で解析エラーが発生します (PI は次のようになります) 3,1415).
アプリケーション内ですべてのスレッドに対して CultureInfo をグローバルに設定する方法が必要です。私はもう試した:
- (一見) 慣例的な設定方法 現在のスレッド.現在のカルチャー の最初の行として 主要() しかし、リセットされるようです。
- のバリエーション/拡張 http://www.codeproject.com/KB/cs/Change_App_Culture.aspx
- アプリケーション内で明示的に作成されたスレッドに対しても同じこと (#1) を実行します。
また、明示的な書式設定を使用するように変更することはできません (15 万行以上、そのほとんどは元従業員によって書かれています)。
[編集]アプリケーションはソケットにバインドし、専用クライアントからのリクエストを処理します。リクエストのタイプに応じて、異なるハンドラー クラスが生成されます。
申し訳ありませんが、最初に投稿したときに、#1 で次のことを明確にする必要がありました (でも、) 明示的に生成されたすべてのハンドラーでもこれを実行しました。
問題の原因となっているスレッド/ハンドラーを見逃していたことが判明しました。 したがって、アプリケーションは現在適切に動作していますが、カルチャをすべてのスレッドに設定できるかどうかについては疑問が残ります。
すべてのスレッドを反復処理できれば、問題も解決します。それで:
どうすればすべて入手できますか 糸 オブジェクト(ではありません) プロセススレッド) 現在のプロセスで?
解決
残念ながら、すべての新しいスレッドは、それがそのロケールが何か他のものに変更されていたのスレッドから始まっていても場合、システムロケール情報で始まります。
このファイルをロードするためにBackgroundWorker
を使用しているとき、私は我々のアプリの一つにに走った巨大な落とし穴だっます。
私が正常に使用してきたアプローチは、起動時のスレッドでロケールを設定し、その後にスレッドを作成するスレッドファクトリを使用することです「アプリケーションのロケール。」 Thread
がない間BackgroundWorker
が封入されているようBackgroundWorkersのためには、工場や派生クラスのいずれかを使用できます。
他のヒント
.NET 4.5では、あなたがCultureInfo.DefaultThreadCurrentCultureを使用することができます。
私はあなたが全体のアプリケーションのための文化を設定することができるとは思わないが、あなたがスレッドを作成するたびに培養expliciltyを設定することができます:
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");