NOTA: materiale datato, assicuratevi di leggere l'aggiornamento al fondo per le modifiche in .NET 4.6
Sì, questo è un comune richiesta ma non è disponibile. Windows inizializza sempre un thread del sistema operativo sull'LCID predefinito del sistema, configurato nell'applet Opzioni internazionali e della lingua nel Pannello di controllo. È possibile ignorare questo finché si creano i thread da soli. Ma ciò non è pratico per thread e thread threadpool che potrebbero essere stati creati da un qualche tipo di codice non gestito che esegue il processo, come un server COM.
Quest'ultimo caso è il problema. .NET non ha problemi a eseguire codice gestito su thread creati da codice non gestito. Ma non può fare nulla sul modo in cui il thread è inizializzato. Questo è vero per CurrentUICulture ma anche per cose più oscure come Thread.SetApartmentState(). Non sottovalutare la probabilità che un thread di questo tipo esegua codice nel tuo programma, i server COM scritti da Microsoft sono molto felici.
Dovrai versare il codice con un pettine a denti fini e trovare qualsiasi codice che possa essere eseguito su un filo che non hai creato. Qualsiasi gestore di eventi è sospetto, come qualsiasi metodo BeginXxx() che ha un callback. BackgroundWorker è sicuramente il problema minore.
Non sovrascrivere la cultura del thread può produrre molto bug difficile e difficile da diagnosticare. Un buon esempio sarebbe un SortedList che digita su una stringa. Quando viene eseguito con la cultura sbagliata, casualmente non riuscirà a trovare gli elementi effettivamente presenti nella lista. Causato dall'elenco non più ordinato in un'altra cultura con regole di confronto diverse.
Se sono riuscito a spaventarti abbastanza, ho ricevuto il mio messaggio. Questo è successo a me, facendo il debug di un problema con un programma molto grande che si è comportato male su una macchina danese. Non avevamo una localizzazione danese e abbiamo costretto l'interfaccia utente a girare in inglese. Un thread di lavoro utilizzava un albero rosso-nero che aveva una stringa come chiave. Falliva casualmente quando gli veniva chiesto di trattare con Åårdvårks. Mi ci sono voluti una settimana.
Aggiornamento: questo problema è stato risolto in .NET 4.5. La classe CultureInfo ora ha un DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture. Se impostato, verrà utilizzato per inizializzare la cultura di qualsiasi thread gestito anziché la cultura di sistema predefinita di Windows.Il modo in cui interagisce con i thread avviati dal codice nativo e che inserisci codice gestito non mi è ancora chiaro.
Aggiornamento: questo problema ha avuto una soluzione più approfondita in .NET 4.6. La cultura ora scorre automaticamente, il comportamento ideale. L'articolo MSDN per CultureInfo.CurrentCulture() ne parla. Le informazioni fornite sono ancora confuse, sperimentalmente sembra anche che fluisca su un oggetto Thread e non solo su un thread Task o Threadpool e DefaultThreadCurrentCulture non viene utilizzato. Due passi avanti, un passo indietro, si consiglia di testare.