ho seguito pseudo-codiceMantenere CurrentCulture in asincrone/attendere
string GetData()
{
var steps = new List<Task<string>>
{
DoSomeStep(),
DoSomeStep2()
};
await Task.WhenAll(steps);
return SomeResourceManagerProxy.RetrieveValuesForLocalizedStrings(steps.Select(s => s.Result));
}
Questo metodo viene chiamato da WebService, dove ho impostato Thread.CurrentUICulture
in base alle impostazioni del browser dell'utente.
Dopo l'attesa, lo CurrentUICulture
si perde (corro su un thread diverso).
ho risolto il problema con le seguenti:
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();
Questo ha uno svantaggio - necessità di ricordarsi di chiamare KeepCulture() su ogni operazione che viene atteso. (Ho anche qualche metodo di estensione per mantenere la cultura dell'interfaccia utente nell'attività).
C'è un modo più semplice per conservare la cultura dell'interfaccia utente?
una nota: sto scrivendo framework per la localizzazione di cose che erano già state scritte in asincrono/attesa. Mi piacerebbe che tutto fosse il più trasparente possibile per gli altri sviluppatori – nothrow
Ho visto una soluzione simile in uno dei repository .NET qualche tempo fa. Potrebbe essere stato EF. Penso che l'abbiano cancellato per qualche motivo, quindi è necessario eseguire la scansione dei log. – usr
Forse il tempo di chiudere questo Q + A, il problema è stato risolto. –