web-dev-qa-db-ja.com

.Netで(現在のスレッドだけでなく)プロセス全体のCurrentCultureを変更するにはどうすればよいですか?

プロセスのロケールをen-USに設定する必要がある状況があります。

私は現在のスレッドに対してこれを行う方法を知っています:

System.Threading.Thread.CurrentThread.CurrentCulture = 
     System.Globalization.CultureInfo.CreateSpecificCulture("en-US");

しかし、私のアプリケーションはBackgroundWorkersを使用して処理を行っており、これらのワーカースレッドのロケールは、上記の生成メインスレッドへの変更の影響を受けていないようです。

では、アプリケーションのすべてのスレッドにロケールを手動で設定せずに、どのように設定できますか?

16
Assaf Lavie

必要に応じて、オペレーティングシステムのロケールを変更する必要があります。どのような理由でBackgroundWorkersをen-USで実行したいですか?

ビジネスレイヤーを不変のカルチャで実行し、エンドユーザーのUIに特定のカルチャのみを設定する必要があります。

BackgroundWorker コンポーネントを使用していて、これを実行する必要がある場合は、DoWorkメソッドで次のようなことを試すことができます。

// In DoWork
System.Globalization.CultureInfo before = System.Threading.Thread.CurrentThread.CurrentCulture;
try

{
    System.Threading.Thread.CurrentThread.CurrentCulture = 
        new System.Globalization.CultureInfo("en-US");
 // Proceed with specific code
}

finally
{
    System.Threading.Thread.CurrentThread.CurrentUICulture = before;
}
14
RichardOD

4.0では、スレッドごとにカルチャを設定して、これを自分で管理する必要があります。ただし、4.5では、appdomainのカルチャを定義できます。これは、これを処理するための推奨される方法です。関連するAPIは CultureInfo.DefaultThreadCurrentCulture および CultureInfo.DefaultThreadCurrentUICulture です。

10
Eric MSFT

これを使って:

worker.RunWorkerAsync(Thread.CurrentThread.CurrentCulture.LCID);//Pass the LCID as argument

仕事をした後、これを作ります:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(int.Parse(e.Argument.ToString()));
1
Paolo30Rose

BackgroudWorkerのヘルパークラスは次のように使用します。

public static class BackgroundWorkerHelper
{
public static void RunInBackground(Action doWorkAction, Action completedAction, CultureInfo cultureInfo)
    {
        var worker = new BackgroundWorker();
        worker.DoWork += (_, args) =>
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo;
            System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo;
            doWorkAction.Invoke();
        };
        worker.RunWorkerCompleted += (_, args) =>
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo;
            System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo;
            completedAction.Invoke();
        };

        worker.RunWorkerAsync();
    }
}

使用例:

BackgroundWorkerHelper.RunInBackground(() => { Work(); }, () => { AfterWork(); },Thread.CurrentThread.CurrentCulture);
0
Ondřej Vykouk