2

こんにちは–「Accept-Language」ヘッダーに基づいてCurrentUICultureを設定することにより、エラー文字列などのサーバー側のローカリゼーションを処理することを計画していますが、非同期呼び出しでは流れないようです。以下は問題を説明するためのサンプルコード、非同期呼び出しのローカリゼーションを処理するデフォルトの方法はありますか?

   public async Task<HttpResponseMessage> GetAsync()
    {            
        //set the current ui culture, to say "fr-FR", based on "Accept-Language" header
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("**fr-FR**");  

       var task = httpClient.PutAsync(endpoint, content)            

        //do some processing

        var res  = await task;

        var culture = Thread.CurrentThread.CurrentUICulture.Name; **//ITS NOT necessarily fr-FR**

        //do some more processing
        //and handle localizations etc.

        return res;
    }

特に実際の非同期操作がある場合に、ローカリゼーションを処理するためのよりクリーンでシームレスな方法を探しています。await呼び出しに続くコードの場合

編集:わかりやすくするために、Task.Run()をhttpClient.PutAsyncに置き換えました

4

1 に答える 1

2

Task.RunコンテキストはありTask.Factory.StartNewません。これは予想される動作です。awaitキーワードを使用すると、コンテキストが保持されます。だからここにあなたができることがあります:

public static async Task<IEnumerable<string>> GetAsync()
{            
    //set the current ui culture, to say "fr-FR", based on "Accept-Language" header
    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");

    //do some processing

    var s = await GetSomething();

    var culture = Thread.CurrentThread.CurrentUICulture.Name; //It's ja-JP

    return new[] { s, s };
}

public static Task<string> GetSomething()
{
    var cuture = Thread.CurrentThread.CurrentUICulture.Name; // It's fr-FR
    var tcs = new TaskCompletionSource<string>();
    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("ja-JP");
    tcs.SetResult("<something>");
    return tcs.Task;
}
于 2012-12-31T09:09:46.387 に答える