web-dev-qa-db-ja.com

.NETアプリケーションまたはスレッドのみにCultureInfoを設定することは可能ですか?

GUIやUIを持たないC#で記述されたアプリケーションがありますが、代わりに別のアプリケーション(XMLなど)によって解析されるファイルを書き込みます。

CultureInfoのNumberDecimalSeparatorがコンマに設定されている顧客がいます。これにより、浮動小数点数で解析エラーが発生します(PIは3,1415として終了します) 。

すべてのスレッドについて、アプリケーション内でCultureInfoをグローバルに設定する方法が必要です。私はもう試した:

  1. Main()の最初の行としてCurrentThread.CurrentCultureを設定する(明らかに)慣習的なアプローチですがリセットされたようです。
  2. http://www.codeproject.com/KB/cs/Change_App_Culture.aspx のバリエーション/拡張
  3. アプリケーションで明示的に作成されたスレッドで同じ(#1)を実行します。

また、明示的なフォーマットを使用するように変更することはできません(15万行以上、ほとんどが元従業員によって書かれています)。

[編集]アプリケーションはソケットにバインドし、専用クライアントからの要求を処理します。リクエストタイプに応じて、異なるハンドラークラスを生成します。

申し訳ありませんが、最初に投稿したとき、#1で、(私は)明示的に生成されたすべてのハンドラーでもこれを行ったことを明確にする必要がありました。

問題の原因となっているスレッド/ハンドラーを見逃したことが判明しました。アプリケーションは正常に動作していますが、カルチャをすべてのスレッドに設定できるかどうかについては疑問が残ります。 。

すべてのスレッドを反復処理できれば、問題も解決します。そう:

現在のプロセスのすべてのThreadオブジェクト(ProcessThreadではない)を取得するにはどうすればよいですか?

24
NVRAM

残念ながら、新しいスレッドはすべて、ロケールが別のスレッドに変更されたスレッドから開始された場合でも、システムロケール情報で開始されます。

これは、BackgroundWorkerを使用してファイルをロードするときにアプリの1つで遭遇した大きな落とし穴でした。

私がうまく使用したアプローチは、起動スレッドにロケールを設定してから、スレッドファクトリを使用して「アプリケーションロケール」でスレッドを作成することです。 BackgroundWorkersの場合、Threadは封印されていますが、BackgroundWorkerは封印されていないため、ファクトリまたは派生クラスのいずれかを使用できます。

14
Jon Seigel

.NET 4.5では、CultureInfo.DefaultThreadCurrentCultureを使用できます。

35
BPeter

アプリケーション全体のカルチャを設定できるとは思いませんが、スレッドを作成するたびにカルチャの明示性を設定できます。

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

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

3
friuns