В соответствии с ответом в этот вопрос async/await
вызов должен сохранить CurrentCulture. В моем случае, когда я называю свои собственные методы асинхронизации, CurrentCulture сохраняется. Но если я вызываю некоторый метод службы WCF, CurrentCulture не сохраняется, он изменяется на то, что выглядит как культура потоков по умолчанию сервера.
Я посмотрел, какие управляемые потоки вызываются. Бывает так, что каждая строка кода выполнялась на одном управляемом потоке (ManagedThreadId остается тем же). И CultureInfo остается неизменным после вызова моего собственного метода асинхронизации. Но когда я вызываю метод WCF, ManagedTrheadId остается прежним, но CurrentCulture изменен.
Упрощенный код выглядит так:
private async Task Test()
{
// Befoe this code Thread.CurrentThread.CurrentCulture is "ru-RU", i.e. the default server culture
// Here we change current thread culture to some desired culture, e.g. hu-HU
Thread.CurrentThread.CurrentCulture = new CultureInfo("hu-HU");
var intres = await GetIntAsync();
// after with await Thread.CurrentThread.CurrentCulture is still "hu-HU"
var wcfres = await wcfClient.GetResultAsync();
// And here Thread.CurrentThread.CurrentCulture is "ru-RU", i.e. the default server culture
}
private async Task<int> GetIntAsync()
{
return await Task.FromResult(1);
}
wcfClient
- это экземпляр автоматически созданного клиента WCF (наследник System.ServiceModel.ClientBase
)
Все это происходит в ASP.NET MVC Web API (самообслуживании), я использую заголовок Accept-Language, чтобы установить CurrentCulture для доступа к нему позже и использовать его для возврата локализованных ресурсов. Я мог бы двигаться без CurrentCulture и просто передавать CultureInfo всем методам, но мне не нравится этот подход.
Почему CurrentThread CurrentCulture изменяется после вызова службы WCF и остается неизменным после вызова моего собственного метода асинхронизации? Может ли оно быть "исправлено"?