REMARQUE: matériel périmé, assurez-vous de lire la mise à jour au bas des changements dans .NET 4.6
Oui, ceci est une commune demande mais ce n'est pas disponible. Windows initialise toujours un thread de système d'exploitation sur le LCID par défaut du système, configuré dans l'applet Options régionales et linguistiques du Panneau de configuration. Vous pouvez remplacer cela aussi longtemps que vous créez vous-même les threads. Mais ce n'est pas pratique pour les threads threads et les threads qui pourraient avoir été créés par un type de code non géré exécutant votre processus, comme un serveur COM.
Le dernier cas est le problème. .NET n'a aucun problème à exécuter du code managé sur les threads créés par du code non managé. Mais il ne peut rien faire sur la façon dont le thread est initialisé. C'est vrai pour CurrentUICulture mais aussi pour des choses plus obscures comme Thread.SetApartmentState(). Ne sous-estimez pas la probabilité qu'un tel thread exécute du code dans votre programme, les serveurs COM écrits par Microsoft sont très générateurs de threads.
Vous devrez passer à travers votre code avec un peigne à dents fines et trouver tout code qui pourrait fonctionner sur un thread que vous n'avez pas créé. Tout gestionnaire d'événement est suspect, comme toute méthode BeginXxx() qui a un callback. BackgroundWorker est certainement le problème mineur.
Ne pas surcharger la culture du fil peut produire très subtile et difficile à diagnostiquer bugz. Un bon exemple serait une SortedList qui touche une chaîne. Lorsqu'il est exécuté avec la mauvaise culture, il échouera au hasard à trouver les éléments qui sont réellement présents dans la liste. Causée par le fait que la liste n'est plus triée dans une autre culture avec des règles de classement différentes.
Si j'ai réussi à vous faire assez peur alors j'ai eu mon message. Cela m'est arrivé, en déboguant un problème avec un très gros programme qui s'est mal comporté sur une machine danoise. Nous n'avions pas de localisation danoise et avons forcé l'interface utilisateur à fonctionner en anglais. Un thread de travail utilisait un arbre rouge-noir avec une chaîne comme clé. Il a échoué au hasard lorsqu'on lui a demandé de traiter avec Åårdvårks. Ça m'a pris une semaine.
Mise à jour: ce problème a été résolu dans .NET 4.5. La classe CultureInfo a maintenant un DefaultThreadCurrentCulture et DefaultThreadCurrentUICulture. Lorsqu'il est défini, il sera utilisé pour initialiser la culture de n'importe quel thread géré au lieu de la culture système Windows par défaut.La manière exacte dont il interagit avec les threads qui ont été démarrés par le code natif et qui entrent dans le code managé n'est pas encore claire pour moi.
Mise à jour: ce problème a une solution plus complète dans .NET 4.6. La culture coule maintenant automatiquement, le comportement idéal. L'article MSDN pour CultureInfo.CurrentCulture() en parle. Les informations fournies sont encore confuses, expérimentalement, il semble également circuler vers un objet Thread et pas seulement un thread Task ou threadpool et DefaultThreadCurrentCulture n'est pas utilisé. Deux pas en avant, un pas en arrière, un test est recommandé.