2017-06-06 1 views
3

マイクロソフトからの次の情報のため、私は少しコードを更新しました。現在のカルチャーを私が使うことのできるものにアップデートしたようです。 CultureInfo.CurrentCultureとCultureInfo.CurrentUICulture非同期横切っ 操作を流れるスレッドののExecutionContextに に格納されている の.NET Framework 4.6およびそれ以降のバージョンが、ターゲットアプリケーションについて.net-4.6の非同期Thread.CurrentThread.CurrentCulture

。 (ソース:https://msdn.microsoft.com/en-us/library/dn833123(v=vs.110).aspx

using System; 
using System.Globalization; 
using System.Threading; 
using System.Threading.Tasks; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("start " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId); 
     RunAsync().Wait(); 
     Console.WriteLine("Finish " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId); 
     Console.ReadKey(); 
    } 

    static async Task RunAsync() 
    { 
     Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-DE"); 

     Console.WriteLine("1 " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId); 
     string cultureInTask = string.Empty; 

     await Task.Run(() => cultureInTask = Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId).ConfigureAwait(true); 

     Console.WriteLine("2 " + cultureInTask); 
     string twoA = await TestMethodAsync(); 
     Console.WriteLine("2a " + twoA + " " + Thread.CurrentThread.ManagedThreadId); 
     Console.WriteLine("3 " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId);    
    } 

    public static async Task<string> TestMethodAsync() 
    { 
     Console.WriteLine("2s " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId); 
     return await Task.Run(() => 
     { 
      return System.Threading.Thread.CurrentThread.CurrentUICulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId; 
     }); 
    } 
} 

出力:

start en-US 1 
1 de-DE 1 
2 de-DE 3 
2s de-DE 3 
2a en-US 4 4 
3 de-DE 4 
Finish en-US 1 

しかし、なぜ2aはEN-USはなく、デDE戻っていますか?それはexecutionContextが異なるためですか?もしそうなら、どうすれば同じ実行コンテキストに留まることができますか?

+0

引用したドキュメントにリンクすることはできますか? –

+0

https://msdn.microsoft.com/en-us/library/dn833123(v=vs.110).aspxまた、メインポストで編集しました – user1408786

+0

一度作業してしまえばこれを誤植として閉じようとしましたそれは、しかし、私はそれに答えるには十分に面白いと思う... –

答えて

2

CurrentCultureおよびCurrentUICultureは独立した特性である。 CurrentCultureのみを設定していて、CurrentUICultureを報告しています)のを除くすべての場所でレポートしています。コード全体で同じプロパティーを一貫して使用すると(どちらのプロパティーも問題ありません)、期待される結果が得られます。

+0

ありがとう、それは私のテストスクリプトのtypoだった。しかし、私はこのコード行を渡すと、なぜSystem.Threading.Thread.CurrentThread.CurrentCulture.IetfLanguageTagが私のシステムのデフォルトに変わるのか混乱しています。 using(SqlDataReader rdr = await cmd.ExecuteReaderWithRetryAsync()。ConfigureAwait(false)) – user1408786

+0

@ user1408786: 'SqlDataReader'のバグかどうか疑問に思っています...現在のカルチャを混乱させる可能性があります... –

+1

@ user1408786:興味のないことは、 'ConfigureAwait(false)'?私は、同期コンテキストが実行コンテキストと同じではないので、違いを生み出すとは期待しませんが、それはそれに関連している可能性があります。 –