diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs b/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs index 6dc54c786d031c..a49a7b780abee4 100644 --- a/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/src/HostFactoryResolver.cs @@ -194,10 +194,6 @@ public HostingListener(string[] args, MethodInfo entryPoint, TimeSpan waitTimeou public object CreateHost() { - // Set the async local to the instance of the HostingListener so we can filter events that - // aren't scoped to this execution of the entry point. - _currentListener.Value = this; - using var subscription = DiagnosticListener.AllListeners.Subscribe(this); // Kick off the entry point on a new thread so we don't block the current one @@ -208,6 +204,10 @@ public object CreateHost() try { + // Set the async local to the instance of the HostingListener so we can filter events that + // aren't scoped to this execution of the entry point. + _currentListener.Value = this; + var parameters = _entryPoint.GetParameters(); if (parameters.Length == 0) { diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/HostFactoryResolverTests.cs b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/HostFactoryResolverTests.cs index 567b73e55f718a..8f6cf79de0bf3e 100644 --- a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/HostFactoryResolverTests.cs +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/HostFactoryResolverTests.cs @@ -6,6 +6,7 @@ using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Threading; +using System.Threading.Tasks; using Xunit; namespace Microsoft.Extensions.Hosting.Tests @@ -250,5 +251,27 @@ public void TopLevelStatements() Assert.NotNull(factory); Assert.IsAssignableFrom(factory(Array.Empty())); } + + [ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsThreadingSupported))] + [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(NoSpecialEntryPointPattern.Program))] + public void NoSpecialEntryPointPatternCanRunInParallel() + { + var factory = HostFactoryResolver.ResolveServiceProviderFactory(typeof(NoSpecialEntryPointPattern.Program).Assembly, s_WaitTimeout); + Assert.NotNull(factory); + + var tasks = new Task[30]; + int index = 0; + for (int i = 0; i < tasks.Length; i++) + { + tasks[index++] = Task.Run(() => factory(Array.Empty())); + } + + Task.WaitAll(tasks); + + foreach (var t in tasks) + { + Assert.IsAssignableFrom(t.Result); + } + } } } diff --git a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/NoSpecialEntryPointPatternHangs/Program.cs b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/NoSpecialEntryPointPatternHangs/Program.cs index e8183fce884337..52ac9d43ccabf3 100644 --- a/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/NoSpecialEntryPointPatternHangs/Program.cs +++ b/src/libraries/Microsoft.Extensions.HostFactoryResolver/tests/NoSpecialEntryPointPatternHangs/Program.cs @@ -9,7 +9,7 @@ public class Program { public static void Main(string[] args) { - Console.ReadLine(); + System.Threading.Thread.Sleep(-1); } } }