From 1589b54018b5a084c3a2ec067bbef49f1d3133fd Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sun, 15 Nov 2015 21:56:20 +0000 Subject: [PATCH] Early bail, completed tasks+Interlocked --- .../Http/MessageBody.cs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/MessageBody.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/MessageBody.cs index 1604d0145d..7e75fcb1bb 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/MessageBody.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/MessageBody.cs @@ -41,17 +41,27 @@ namespace Microsoft.AspNet.Server.Kestrel.Http public async Task Consume(CancellationToken cancellationToken = default(CancellationToken)) { Task result; + var firstLoop = true; do { - var send100Continue = 0; result = SkipAsyncImplementation(cancellationToken); if (!result.IsCompleted) { - send100Continue = Interlocked.Exchange(ref _send100Continue, 0); + if (firstLoop && Interlocked.Exchange(ref _send100Continue, 0) == 1) + { + firstLoop = false; + _context.FrameControl.ProduceContinue(); + } } - if (send100Continue == 1) + else if (result.GetAwaiter().GetResult() == 0) { - _context.FrameControl.ProduceContinue(); + // Completed Task, end of stream + return; + } + else + { + // Completed Task, get next Task rather than await + continue; } } while (await result != 0); }