From bae733151be352eed77c07dcdc13d87862a68477 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Tue, 23 Apr 2019 01:21:19 +0100 Subject: [PATCH] Lazy create RequestServicesFeature DisposeAsync statemachine (#9512) --- ...Microsoft.AspNetCore.Http.netcoreapp3.0.cs | 1 - .../src/Features/RequestServicesFeature.cs | 20 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/Http/Http/ref/Microsoft.AspNetCore.Http.netcoreapp3.0.cs b/src/Http/Http/ref/Microsoft.AspNetCore.Http.netcoreapp3.0.cs index 82c72e693b..16ad1810c3 100644 --- a/src/Http/Http/ref/Microsoft.AspNetCore.Http.netcoreapp3.0.cs +++ b/src/Http/Http/ref/Microsoft.AspNetCore.Http.netcoreapp3.0.cs @@ -249,7 +249,6 @@ namespace Microsoft.AspNetCore.Http.Features public RequestServicesFeature(Microsoft.AspNetCore.Http.HttpContext context, Microsoft.Extensions.DependencyInjection.IServiceScopeFactory scopeFactory) { } public System.IServiceProvider RequestServices { get { throw null; } set { } } public void Dispose() { } - [System.Diagnostics.DebuggerStepThroughAttribute] public System.Threading.Tasks.ValueTask DisposeAsync() { throw null; } } public partial class ResponseBodyPipeFeature : Microsoft.AspNetCore.Http.Features.IResponseBodyPipeFeature diff --git a/src/Http/Http/src/Features/RequestServicesFeature.cs b/src/Http/Http/src/Features/RequestServicesFeature.cs index 151002d7fa..6585127367 100644 --- a/src/Http/Http/src/Features/RequestServicesFeature.cs +++ b/src/Http/Http/src/Features/RequestServicesFeature.cs @@ -42,12 +42,19 @@ namespace Microsoft.AspNetCore.Http.Features } } - public async ValueTask DisposeAsync() + public ValueTask DisposeAsync() { switch (_scope) { case IAsyncDisposable asyncDisposable: - await asyncDisposable.DisposeAsync(); + var vt = asyncDisposable.DisposeAsync(); + if (!vt.IsCompletedSuccessfully) + { + return Awaited(this, vt); + } + // If its a IValueTaskSource backed ValueTask, + // inform it its result has been read so it can reset + vt.GetAwaiter().GetResult(); break; case IDisposable disposable: disposable.Dispose(); @@ -56,6 +63,15 @@ namespace Microsoft.AspNetCore.Http.Features _scope = null; _requestServices = null; + + return default; + + static async ValueTask Awaited(RequestServicesFeature servicesFeature, ValueTask vt) + { + await vt; + servicesFeature._scope = null; + servicesFeature._requestServices = null; + } } public void Dispose()