У меня есть следующий псевдокод
string GetData()
{
var steps = new List<Task<string>>
{
DoSomeStep(),
DoSomeStep2()
};
await Task.WhenAll(steps);
return SomeResourceManagerProxy.RetrieveValuesForLocalizedStrings( steps.Select(s => s.Result) );
}
Этот метод вызывается из WebService, где я устанавливаю Thread.CurrentUICulture
в соответствии с настройками браузера пользователя.
После ожидания CurrentUICulture
теряется (я запускаю в другом потоке).
Я решил проблему следующим образом:
public class MyAwaiter<T> : INotifyCompletion
{
private TaskAwaiter<T> waiter;
private CultureInfo culture;
public MyAwaiter(TaskAwaiter<T> waiter)
{
this.waiter = waiter;
}
public PreserveCultureAwaiter<T> GetAwaiter() { return this; }
public bool IsCompleted { get { return waiter.IsCompleted; } }
public void OnCompleted(Action continuation)
{
culture = Thread.CurrentThread.CurrentUICulture;
waiter.OnCompleted(continuation);
}
public T GetResult()
{
Thread.CurrentThread.CurrentUICulture = culture;
return waiter.GetResult();
}
}
public static MyAwaiter<T> KeepCulture<T>(this Task<T> task)
{
return new MyAwaiter<T>(task.GetAwaiter());
}
...
await Task.WhenAll(steps).KeepCulture();
У этого есть один недостаток - необходимость запоминать вызов KeepCulture() для каждой ожидаемой задачи. (У меня также есть метод расширения, чтобы сохранить культуру пользовательского интерфейса в задаче).
Есть ли более простой способ сохранения культуры пользовательского интерфейса?