To add more details to @Yuval Itzchakov, I usually create some extension methods for the TaskFactory class that preserve Culture (usually I also add one that receives an action that sets any given property to the executable stream
#region StartNewWithPersistedCulture methods public static Task<TResult> StartNewWithPersistedCulture<TResult>( this TaskFactory taskFactory, Func<TResult> function, CancellationToken cancellationToken = default (CancellationToken), TaskCreationOptions creationOptions = default (TaskCreationOptions)) { if (taskFactory == null) throw new ArgumentNullException("taskFactory"); if (function == null) throw new ArgumentNullException("function"); var currentCulture = Thread.CurrentThread.CurrentCulture; var currentUICulture = Thread.CurrentThread.CurrentUICulture; return taskFactory.StartNew( () => { Thread.CurrentThread.CurrentCulture = currentCulture; Thread.CurrentThread.CurrentUICulture = currentUICulture; return function(); }, cancellationToken, creationOptions, TaskScheduler.Default); } public static Task StartNewWithPersistedCulture( this TaskFactory taskFactory, Action action, CancellationToken cancellationToken = default (CancellationToken), TaskCreationOptions creationOptions = default (TaskCreationOptions)) { if (taskFactory == null) throw new ArgumentNullException("taskFactory"); if (action == null) throw new ArgumentNullException("action"); var currentCulture = Thread.CurrentThread.CurrentCulture; var currentUICulture = Thread.CurrentThread.CurrentUICulture; return taskFactory.StartNew( () => { Thread.CurrentThread.CurrentCulture = currentCulture; Thread.CurrentThread.CurrentUICulture = currentUICulture; action(); }, cancellationToken, creationOptions, TaskScheduler.Default); }
source share