| File: Utilities\ThreadPoolExtensions.cs | Web Access |
| Project: src\msbuild\src\Framework\Microsoft.Build.Framework.csproj (Microsoft.Build.Framework) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Globalization; using System.Threading; #nullable disable namespace Microsoft.Build.Shared { /// <summary> /// Class to wrap the saving and restoring of the culture of a threadpool thread /// </summary> internal static class ThreadPoolExtensions { /// <summary> /// Queue a threadpool thread and set it to a certain culture. /// </summary> internal static bool QueueThreadPoolWorkItemWithCulture(WaitCallback callback, CultureInfo culture, CultureInfo uiCulture) { bool success = ThreadPool.QueueUserWorkItem( delegate (Object state) { // Save the culture so at the end of the threadproc if something else reuses this thread then it will not have a culture which it was not expecting. CultureInfo originalThreadCulture = CultureInfo.CurrentCulture; CultureInfo originalThreadUICulture = CultureInfo.CurrentUICulture; try { if (CultureInfo.CurrentCulture != culture) { Thread.CurrentThread.CurrentCulture = culture; } if (CultureInfo.CurrentUICulture != uiCulture) { Thread.CurrentThread.CurrentUICulture = uiCulture; } callback(state); } finally { // Set the culture back to the original one so that if something else reuses this thread then it will not have a culture which it was not expecting. if (CultureInfo.CurrentCulture != originalThreadCulture) { Thread.CurrentThread.CurrentCulture = originalThreadCulture; } if (CultureInfo.CurrentUICulture != originalThreadUICulture) { Thread.CurrentThread.CurrentUICulture = originalThreadUICulture; } } }); return success; } } }