From cfc22fe0dfc0f2e977c2746182a7bb7be9c93d22 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 12 Apr 2019 04:50:09 +0100 Subject: [PATCH] Lazy create ResourceInvoker.InvokeNextResultFilterAwaitedAsync statemachine --- .../src/Infrastructure/ResourceInvoker.cs | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ResourceInvoker.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ResourceInvoker.cs index 6a3728b36b..052a88bc72 100644 --- a/src/Mvc/Mvc.Core/src/Infrastructure/ResourceInvoker.cs +++ b/src/Mvc/Mvc.Core/src/Infrastructure/ResourceInvoker.cs @@ -1366,7 +1366,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure } } - private async Task InvokeNextResultFilterAwaitedAsync() + private Task InvokeNextResultFilterAwaitedAsync() where TFilter : class, IResultFilter where TFilterAsync : class, IAsyncResultFilter { @@ -1375,6 +1375,28 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure { // If we get here, it means that an async filter set cancel == true AND called next(). // This is forbidden. + return Throw(); + } + + var task = InvokeNextResultFilterAsync(); + if (!task.IsCompletedSuccessfully) + { + return Awaited(this, task); + } + + Debug.Assert(_resultExecutedContext != null); + return Task.FromResult(_resultExecutedContext); + + static async Task Awaited(ResourceInvoker invoker, Task task) + { + await task; + + Debug.Assert(invoker._resultExecutedContext != null); + return invoker._resultExecutedContext; + } +#pragma warning disable CS1998 + static async Task Throw() + { var message = Resources.FormatAsyncResultFilter_InvalidShortCircuit( typeof(IAsyncResultFilter).Name, nameof(ResultExecutingContext.Cancel), @@ -1383,13 +1405,10 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure throw new InvalidOperationException(message); } - - await InvokeNextResultFilterAsync(); - - Debug.Assert(_resultExecutedContext != null); - return _resultExecutedContext; +#pragma warning restore CS1998 } + private static void Rethrow(ResourceExecutedContext context) { if (context == null)