diff --git a/src/mscorlib/corefx/System/Globalization/CultureInfo.cs b/src/mscorlib/corefx/System/Globalization/CultureInfo.cs index 2be61f69dc6d..e5e01be032b2 100644 --- a/src/mscorlib/corefx/System/Globalization/CultureInfo.cs +++ b/src/mscorlib/corefx/System/Globalization/CultureInfo.cs @@ -133,6 +133,19 @@ public partial class CultureInfo : IFormatProvider //The parent culture. private CultureInfo m_parent; + static AsyncLocal s_asyncLocalCurrentCulture; + static AsyncLocal s_asyncLocalCurrentUICulture; + + static void AsyncLocalSetCurrentCulture(AsyncLocalValueChangedArgs args) + { + s_currentThreadCulture = args.CurrentValue; + } + + static void AsyncLocalSetCurrentUICulture(AsyncLocalValueChangedArgs args) + { + s_currentThreadUICulture = args.CurrentValue; + } + // // The CultureData instance that reads the data provided by our CultureData class. // @@ -311,7 +324,13 @@ public static CultureInfo CurrentCulture { throw new ArgumentNullException("value"); } - s_currentThreadCulture = value; + + if (s_asyncLocalCurrentCulture == null) + { + Interlocked.CompareExchange(ref s_asyncLocalCurrentCulture, new AsyncLocal(AsyncLocalSetCurrentCulture), null); + } + // this one will set s_currentThreadCulture too + s_asyncLocalCurrentCulture.Value = value; } } @@ -355,8 +374,14 @@ public static CultureInfo CurrentUICulture } CultureInfo.VerifyCultureName(value, true); + + if (s_asyncLocalCurrentUICulture == null) + { + Interlocked.CompareExchange(ref s_asyncLocalCurrentUICulture, new AsyncLocal(AsyncLocalSetCurrentUICulture), null); + } - s_currentThreadUICulture = value; + // this one will set s_currentThreadUICulture too + s_asyncLocalCurrentUICulture.Value = value; } }