嗨 - 我计划基于“Accept-Language” header ,通过基于该 header 设置 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
最佳答案
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;
}
关于asp.net - ASP.NET WebApi 中异步调用的本地化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14099467/