Fix race condition in TaskRegistry/TypeLoader when building with /mt /m mode #12653
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
A race condition in the TypeLoader class caused
System.ObjectDisposedExceptioncrashes when building projects with/mt /m(multi-threaded mode). The error occurred when multiple threads simultaneously loaded task types using MetadataLoadContext:Root Cause
The
MetadataLoadContext _contextfield in TypeLoader.cs (line 46) was declared as static, causing it to be shared across all threads:_contextfield_contextwith its own MetadataLoadContext_contextpropertyInfo.NameSolution
Made the MetadataLoadContext instance-local instead of static to eliminate the shared state:
_contextfield - Eliminated the race condition sourceLoadAssemblyUsingMetadataLoadContext- Returns(Assembly, MetadataLoadContext)tuple to pass the context to the callerGetLoadedTypeFromTypeNameUsingMetadataLoadContext- Uses a local context variable and ensures disposal happens only after all metadata extraction is complete via try-finallyWhy This Works
The MetadataLoadContext is only used to extract metadata (property names, types, attributes) which is stored as strings/primitives during LoadedType construction. All metadata extraction completes before context disposal. The actual task execution happens in the TaskHost process where assemblies are loaded normally, so no access to disposed contexts occurs during runtime.
Testing
Fixes #10664
Original prompt
This section details on the original issue you should resolve
<issue_title>Race condition in TaskRegistry in /mt mode</issue_title>
<issue_description>It seems there is a race condition in TaskRegistry/TypeLoader class