@@ -133,6 +133,19 @@ public partial class CultureInfo : IFormatProvider
133
133
//The parent culture.
134
134
private CultureInfo m_parent ;
135
135
136
+ static AsyncLocal < CultureInfo > s_asyncLocalCurrentCulture ;
137
+ static AsyncLocal < CultureInfo > s_asyncLocalCurrentUICulture ;
138
+
139
+ static void AsyncLocalSetCurrentCulture ( AsyncLocalValueChangedArgs < CultureInfo > args )
140
+ {
141
+ s_currentThreadCulture = args . CurrentValue ;
142
+ }
143
+
144
+ static void AsyncLocalSetCurrentUICulture ( AsyncLocalValueChangedArgs < CultureInfo > args )
145
+ {
146
+ s_currentThreadUICulture = args . CurrentValue ;
147
+ }
148
+
136
149
//
137
150
// The CultureData instance that reads the data provided by our CultureData class.
138
151
//
@@ -311,7 +324,13 @@ public static CultureInfo CurrentCulture
311
324
{
312
325
throw new ArgumentNullException ( "value" ) ;
313
326
}
314
- s_currentThreadCulture = value ;
327
+
328
+ if ( s_asyncLocalCurrentCulture == null )
329
+ {
330
+ Interlocked . CompareExchange ( ref s_asyncLocalCurrentCulture , new AsyncLocal < CultureInfo > ( AsyncLocalSetCurrentCulture ) , null ) ;
331
+ }
332
+ // this one will set s_currentThreadCulture too
333
+ s_asyncLocalCurrentCulture . Value = value ;
315
334
}
316
335
}
317
336
@@ -355,8 +374,14 @@ public static CultureInfo CurrentUICulture
355
374
}
356
375
357
376
CultureInfo . VerifyCultureName ( value , true ) ;
377
+
378
+ if ( s_asyncLocalCurrentUICulture == null )
379
+ {
380
+ Interlocked . CompareExchange ( ref s_asyncLocalCurrentUICulture , new AsyncLocal < CultureInfo > ( AsyncLocalSetCurrentUICulture ) , null ) ;
381
+ }
358
382
359
- s_currentThreadUICulture = value ;
383
+ // this one will set s_currentThreadUICulture too
384
+ s_asyncLocalCurrentUICulture . Value = value ;
360
385
}
361
386
}
362
387
0 commit comments