プロセスのロケールをen-USに設定する必要がある状況があります。
私は現在のスレッドに対してこれを行う方法を知っています:
System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
しかし、私のアプリケーションはBackgroundWorkers
を使用して処理を行っており、これらのワーカースレッドのロケールは、上記の生成メインスレッドへの変更の影響を受けていないようです。
では、アプリケーションのすべてのスレッドにロケールを手動で設定せずに、どのように設定できますか?
必要に応じて、オペレーティングシステムのロケールを変更する必要があります。どのような理由で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;
}
4.0では、スレッドごとにカルチャを設定して、これを自分で管理する必要があります。ただし、4.5では、appdomainのカルチャを定義できます。これは、これを処理するための推奨される方法です。関連するAPIは CultureInfo.DefaultThreadCurrentCulture および CultureInfo.DefaultThreadCurrentUICulture です。
これを使って:
worker.RunWorkerAsync(Thread.CurrentThread.CurrentCulture.LCID);//Pass the LCID as argument
仕事をした後、これを作ります:
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(int.Parse(e.Argument.ToString()));
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);