diff --git a/src/Build/BackEnd/Components/RequestBuilder/RequestBuilder.cs b/src/Build/BackEnd/Components/RequestBuilder/RequestBuilder.cs index d99df97edb7..7aa5a8bfec2 100644 --- a/src/Build/BackEnd/Components/RequestBuilder/RequestBuilder.cs +++ b/src/Build/BackEnd/Components/RequestBuilder/RequestBuilder.cs @@ -1503,6 +1503,7 @@ private sealed class DedicatedThreadsTaskScheduler : TaskScheduler { private readonly BlockingCollection _tasks = new BlockingCollection(); private int _availableThreads = 0; + private int _threadCount = 0; protected override void QueueTask(Task task) { @@ -1538,6 +1539,7 @@ private void RequestThread() private void InjectThread() { + int currentThreadId = Interlocked.Increment(ref _threadCount); var thread = new Thread(() => { foreach (Task t in _tasks.GetConsumingEnumerable()) @@ -1547,6 +1549,7 @@ private void InjectThread() } }); thread.IsBackground = true; + thread.Name = $"MSBuild RequestBuilder Task Scheduler Thread {currentThreadId}"; thread.Start(); } } diff --git a/src/Shared/AwaitExtensions.cs b/src/Shared/AwaitExtensions.cs index ac79035ce3f..b80a1e0106c 100644 --- a/src/Shared/AwaitExtensions.cs +++ b/src/Shared/AwaitExtensions.cs @@ -157,6 +157,11 @@ private class OneSTAThreadPerTaskScheduler : TaskScheduler /// private readonly ConcurrentQueue _queuedTasks = new ConcurrentQueue(); + /// + /// Counter for generating unique thread IDs. + /// + private int _threadCount = 0; + /// /// Returns the list of queued tasks. /// @@ -172,6 +177,7 @@ protected override void QueueTask(Task task) { _queuedTasks.Enqueue(task); + int currentThreadId = Interlocked.Increment(ref _threadCount); ParameterizedThreadStart threadStart = new ParameterizedThreadStart((_) => { Task t; @@ -182,6 +188,7 @@ protected override void QueueTask(Task task) }); Thread thread = new Thread(threadStart); + thread.Name = $"MSBuild STA Task Scheduler Thread {currentThreadId}"; #if FEATURE_APARTMENT_STATE thread.SetApartmentState(ApartmentState.STA); #endif