2017-06-06 7 views
3

En raison des informations suivantes de Microsoft, j'ai mis à jour mon code un peu. On dirait qu'ils ont mis à jour la culture actuelle à quelque chose que je pourrais utiliser.Async Thread.CurrentThread.CurrentCulture dans .net-4.6

Pour les applications qui ciblent le .NET Framework 4.6 et les versions ultérieures, CultureInfo.CurrentCulture et CultureInfo.CurrentUICulture sont stockés dans ExecutionContext d'un fil, qui coule à travers des opérations asynchrones . (source: https://msdn.microsoft.com/en-us/library/dn833123(v=vs.110).aspx)

using System; 
using System.Globalization; 
using System.Threading; 
using System.Threading.Tasks; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("start " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId); 
     RunAsync().Wait(); 
     Console.WriteLine("Finish " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId); 
     Console.ReadKey(); 
    } 

    static async Task RunAsync() 
    { 
     Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-DE"); 

     Console.WriteLine("1 " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId); 
     string cultureInTask = string.Empty; 

     await Task.Run(() => cultureInTask = Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId).ConfigureAwait(true); 

     Console.WriteLine("2 " + cultureInTask); 
     string twoA = await TestMethodAsync(); 
     Console.WriteLine("2a " + twoA + " " + Thread.CurrentThread.ManagedThreadId); 
     Console.WriteLine("3 " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId);    
    } 

    public static async Task<string> TestMethodAsync() 
    { 
     Console.WriteLine("2s " + Thread.CurrentThread.CurrentCulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId); 
     return await Task.Run(() => 
     { 
      return System.Threading.Thread.CurrentThread.CurrentUICulture.ToString() + " " + Thread.CurrentThread.ManagedThreadId; 
     }); 
    } 
} 

Sortie:

start en-US 1 
1 de-DE 1 
2 de-DE 3 
2s de-DE 3 
2a en-US 4 4 
3 de-DE 4 
Finish en-US 1 

Mais pourquoi 2a ​​retour en États-Unis et non de-DE? Est-ce parce que le contexte d'exécution est différent? Si oui, comment puis-je rester dans le même contexte d'exécution?

+0

Pourriez-vous créer un lien vers la documentation que vous avez cité, s'il vous plaît? –

+0

https://msdn.microsoft.com/en-us/library/dn833123(v=vs.110).aspx Je l'ai également édité dans le message principal – user1408786

+0

A été tenté de fermer cela comme une faute de frappe une fois que j'avais travaillé ça sort, mais je pense que c'est assez intéressant pour répondre à la place ... –

Répondre

2

CurrentCulture et CurrentUICulture sont des propriétés indépendantes. Vous définissez seulement CurrentCulture, et vous signalez que partout sauf pour 2a, qui signale CurrentUICulture. Si vous utilisez la même propriété de manière cohérente dans tout le code (l'une ou l'autre des propriétés doit être correcte), les résultats attendus s'affichent.

+0

Merci, c'était une faute de frappe dans mon script de test. Cependant, je suis encore confus pourquoi The System.Threading.Thread.CurrentThread.CurrentCulture.IetfLanguageTag change à la valeur par défaut de mon système lorsque je passe cette ligne de code: en utilisant (SqlDataReader rdr = wait cmd.ExecuteReaderWithRetryAsync(). ConfigureAwait (false)) – user1408786

+0

@ user1408786: Je me demande si c'est un bug dans 'SqlDataReader' ... il peut faire un peu de déconner avec la culture actuelle, ce qui est assez méchant ... –

+1

@ user1408786: Par intérêt, que se passe-t-il si vous n'appelez pas 'ConfigureAwait (false)'? Je ne m'attendrais pas à ce que cela fasse une différence, car le contexte de synchronisation n'est pas le même que le contexte d'exécution, mais il peut être lié à cela ... –