Per i principianti, non era proprio la loro scelta. Quella decisione è stata presa molto tempo prima che iniziassero, la cultura è una proprietà di un thread del sistema operativo. Esaminare i documenti SDK per le funzioni API Get/SetThreadLocale() ad esempio.
Questo non lo spiega completamente, hanno virtualizzato altre funzionalità del sistema operativo, anche se questo è molto difficile da virtualizzare perché molte API sono sensibili alla cultura, in particolare quelle COM.
La prossima buona ragione è che cambiare il processo di cultura in tutto il mondo è estremamente difficile da implementare. È una condizione di gara irrisolvibile. Qualche altro thread potrebbe essere nel bel mezzo di dati di formattazione con affinità culturale. Mentre un blocco funzionerebbe per impedirgli di utilizzare le proprietà della cultura così come sta cambiando, può non impedirgli di cambiare nel mezzo di una catena di chiamate di formattazione. Richiederebbe loro di prendere una sorta di blocco globale e tenerlo premuto per tutta la durata del processo di formattazione. Deadlock è molto probabilmente.
C'è un altro aspetto in questo, uno che penso sia il vero problema. È correlato alla proprietà Thread.ExecutionContext. Il framework usa questo per "fluire" lo stato del thread da un thread all'altro. Molto oscuro ma importante per infondere cose come il contesto di sicurezza su un thread di lavoro. Sarebbe stato ideale se quel contesto fosse anche in grado di impregnare la cultura in modo da poter essere sicuro che tutti i lavoratori che inizi avessero la stessa cultura selezionata e non il default del sistema operativo.
Non è vero, non so davvero perché. Probabilmente perché il primo motivo che ho dato. Che compia, tuttavia, è molto pericoloso cambiare la cultura di un thread. Il tipo di bug che possono causare sono molto sottile. Come creare un SortedDictionary con una stringa come chiave nel thread principale con una cultura predefinita del sistema non operativo. Quindi scoprire che un thread di lavoro non può trovare occasionalmente di nuovo le cose perché le regole di ordinamento delle stringhe sono diverse.
EDIT: c'è qualche sollievo da questo problema in .NET 4.5, supporta il nuovo CultureInfo.DefaultThreadCurrentCulture statica e proprietà DefaultThreadCurrentUICulture.
EDIT2: la cultura ora scorre come descritto nel 4 ° paragrafo in .NET 4.6. Questo dovrebbe alleviare tutte le preoccupazioni.
fonte
2010-11-14 11:46:34