2009-09-22 1 views
12

J'ai une situation dans laquelle je dois définir les paramètres régionaux de mon processus sur en-US.Comment puis-je changer la CurrentCulture de l'ensemble du processus (pas seulement thread en cours) dans .Net?

Je sais comment faire pour le thread courant:

System.Threading.Thread.CurrentThread.CurrentCulture = 
    System.Globalization.CultureInfo.CreateSpecificCulture("en-US"); 

Mais mon application utilise BackgroundWorkers pour faire un peu de traitement, et les paramètres régionaux pour ces threads de travail ne semble pas être affecté par le changement ci-dessus à leur fil principal de frai.

Alors, comment puis-je définir les paramètres régionaux pour tous les threads dans mon application sans le définir dans chacun manuellement?

Répondre

14

Vous devrez modifier les paramètres régionaux du système d'exploitation si vous voulez le faire. Pour quelle raison voulez-vous que BackgroundWorkers s'exécute en-US?

Vous devriez avoir votre couche de gestion fonctionnant dans une culture invariante, et avoir seulement une culture spécifique pour l'interface utilisateur de l'utilisateur final.

Si vous utilisez le composant BackgroundWorker, et avez à faire cela, vous pouvez essayer quelque chose comme ça dans la méthode DoWork:

// In DoWork 
System.Globalization.CultureInfo before = System.Threading.Thread.CurrentThread.CurrentCulture; 
try 

{ 
    System.Threading.Thread.CurrentThread.CurrentCulture = 
     new System.Globalization.CultureInfo("en-US"); 
// Proceed with specific code 
} 

finally 
{ 
    System.Threading.Thread.CurrentThread.CurrentUICulture = before; 
} 
+1

Le travailleur de fond peut très bien être en cours d'exécution dans la couche d'interface utilisateur (comme un composant 'BackgroundWorker' sur un formulaire' par exemple) –

+0

@ Fredrik- Oui (surtout s'il s'agit du composant Background Worker), mais vous ne mettez pas à jour l'interface utilisateur sur le thread de travail en arrière-plan. Au moins vous ne le faites pas si vous l'utilisez correctement. – RichardOD

+0

L'opérateur d'arrière-plan double.Parse (chaîne) sur une entrée, ce qui casse pour certains paramètres régionaux qui ont des représentations de point décimal bizarres. Donc, j'ai encore besoin de savoir comment définir les paramètres régionaux pour l'ensemble du processus. Voulez-vous dire que ce n'est pas possible? –

0

Nous utilisons classe d'aide pour BackgroudWorker comme ceci:

public static class BackgroundWorkerHelper 
{ 
public static void RunInBackground(Action doWorkAction, Action completedAction, CultureInfo cultureInfo) 
    { 
     var worker = new BackgroundWorker(); 
     worker.DoWork += (_, args) => 
     { 
      System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; 
      System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo; 
      doWorkAction.Invoke(); 
     }; 
     worker.RunWorkerCompleted += (_, args) => 
     { 
      System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; 
      System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo; 
      completedAction.Invoke(); 
     }; 

     worker.RunWorkerAsync(); 
    } 
} 

Exemple d'utilisation:

BackgroundWorkerHelper.RunInBackground(() => { Work(); },() => { AfterWork(); },Thread.CurrentThread.CurrentCulture); 
1

Utilisez ceci:

worker.RunWorkerAsync(Thread.CurrentThread.CurrentCulture.LCID);//Pass the LCID as argument 

après le faire du travail en font:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(int.Parse(e.Argument.ToString())); 
+0

+1 pour l'utilisation d'un identifiant de culture au lieu d'un nom de culture. Ceci est nécessaire pour séparer 'Espagnol - Espagne' de' Espagnol - Espagne', par exemple, où '0x0C0A' utilise un ordre de tri international et' 0x040A' utilise un ordre de tri traditionnel. REF: [Classe CultureInfo] (https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.100%29.aspx) – AlwaysLearning

Questions connexes