Przede wszystkim nie był to ich wybór. Ta decyzja została podjęta długo przed ich rozpoczęciem, kultura jest własnością wątku systemu operacyjnego. Przejrzyj dokumenty SDK dla funkcji API Get/SetThreadLocale(), na przykład.
To nie wyjaśnia tego całkowicie, zwirtualizowały one inne funkcje systemu operacyjnego, aczkolwiek trudno je poddać wirtualizacji, ponieważ wiele interfejsów API jest wrażliwych na zmiany kulturowe, szczególnie te związane z architekturą COM.
Kolejnym dobrym powodem jest to, że zmiana całego procesu kultury jest tak trudna do zrealizowania. Jest to nierozwiązywalny stan wyścigu. Niektóre inne wątki mogą znajdować się w trakcie formatowania danych o powinowactwie do kultury. Podczas gdy blokada będzie działać, aby uniemożliwić mu korzystanie z właściwości kultury, tak jak się zmienia, może uniemożliwić jej zmianę w środku łańcucha wywołań formatujących. Wymagałoby to od nich pewnego rodzaju blokady globalnej i trzymania jej przez cały czas trwania zadania formatowania. Zakleszczenie jest prawdopodobnie bardzo.
Jest jeszcze jeden aspekt tego, który uważam za prawdziwy problem. Jest powiązany z właściwością Thread.ExecutionContext. Struktura używa tego do "przepływu" stanu wątku z jednego wątku do drugiego. Bardzo niejasne, ale ważne, aby przesłać rzeczy takie jak kontekst bezpieczeństwa do wątku roboczego. Byłoby idealnie, gdyby kontekst ten mógł również nasycić kulturę, abyś mógł być pewien, że każdy z uruchomionych pracowników ma tę samą kulturę, którą wybrałeś, a nie domyślny system operacyjny.
Nie wiem, nie wiem dlaczego. Prawdopodobnie dlatego, że podałem pierwszy powód. To, że dokonuje, powoduje jednak, że zmiana kultury nici jest bardzo niebezpieczna. Rodzaj błędów, które mogą powodować, jest subtelny. Podobnie jak tworzenie SortedDictionary z ciągiem znaków jako kluczem w głównym wątku z kulturą domyślną niekanałową systemu operacyjnego. Następnie dowiadujemy się, że wątek roboczy nie może czasem znaleźć żadnych informacji, ponieważ reguły sortowania ciągów są różne.
EDIT: jest jakaś ulga z tego problemu w .NET 4.5, obsługuje nową statyczną CultureInfo.DefaultThreadCurrentCulture i właściwości DefaultThreadCurrentUICulture.
EDIT2: kultura płynie zgodnie z opisem w czwartym akapicie w .NET 4.6. To powinno złagodzić wszystkie obawy.