diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs
index 11b7560fa4b..fe351813b94 100644
--- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs
+++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs
@@ -115,6 +115,11 @@ public string SuppressIces
///
private readonly object extractNuGetLock = new object();
+ ///
+ /// Used to syncrhonize access to MSI task items.
+ ///
+ private readonly object msiTaskItemsLock = new();
+
///
/// Generate a set of MSIs for the specified platforms using the specified NuGet package.
///
@@ -124,11 +129,16 @@ public string SuppressIces
protected IEnumerable Generate(string sourcePackage, string swixPackageId, string outputPath, WorkloadPackKind kind, params string[] platforms)
{
NugetPackage nupkg = null;
+ List msis = null;
+
lock (extractNuGetLock)
{
nupkg = new(sourcePackage, Log);
}
- List msis = new();
+ lock (msiTaskItemsLock)
+ {
+ msis = new();
+ }
// MSI ProductName defaults to the package title and fallback to the package ID with a warning.
string productName = nupkg.Title;
@@ -310,7 +320,10 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka
// Generate a .csproj to build a NuGet payload package to carry the MSI and JSON manifest
msi.SetMetadata(Metadata.PackageProject, GeneratePackageProject(msi.ItemSpec, msiJsonPath, platform, nupkg));
- msis.Add(msi);
+ lock (msiTaskItemsLock)
+ {
+ msis.Add(msi);
+ }
});
return msis;
diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs
index 50340821555..6acc58554ed 100644
--- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs
+++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs
@@ -45,11 +45,20 @@ public ITaskItem[] MissingPacks
set;
}
+ ///
+ /// Used for synchronizing on MSI task item.
+ ///
+ private readonly object msiTaskItemsLock = new();
+
public override bool Execute()
{
try
{
- List msis = new();
+ List msis = null;
+ lock (msiTaskItemsLock)
+ {
+ msis = new();
+ }
List missingPacks = new();
if (string.IsNullOrWhiteSpace(PackagesPath))
@@ -96,7 +105,12 @@ public override bool Execute()
System.Threading.Tasks.Parallel.ForEach(packsToGenerate, p =>
{
- msis.AddRange(Generate(p.sourcePackage, p.swixPackageId, p.outputPath, p.kind, p.platforms));
+ var msiItems = Generate(p.sourcePackage, p.swixPackageId, p.outputPath, p.kind, p.platforms);
+
+ lock (msiTaskItemsLock)
+ {
+ msis.AddRange(msiItems);
+ }
});
Msis = msis.ToArray();