From 8f0edde92a02db395793a6bd9084e84b43d9f200 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Wed, 26 Jun 2019 18:54:21 +0100 Subject: [PATCH 1/2] Use task.IsCompletedSuccessfully rather than ReferenceEquals --- .../src/Buffers/PagedBufferedTextWriter.cs | 6 +++--- .../Kestrel/Core/src/Internal/Http/HttpProtocol.cs | 13 +++++-------- .../Internal/Infrastructure/KestrelConnection.cs | 2 +- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedBufferedTextWriter.cs b/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedBufferedTextWriter.cs index 9c74598b24c1..c523883b5f38 100644 --- a/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedBufferedTextWriter.cs +++ b/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedBufferedTextWriter.cs @@ -111,7 +111,7 @@ public override Task WriteAsync(char value) // FlushAsyncCore will return CompletedTask if nothing sync buffered // Fast-path and skip async state-machine if only a single async operation - return ReferenceEquals(flushTask, Task.CompletedTask) ? + return flushTask.IsCompletedSuccessfully ? _inner.WriteAsync(value) : WriteAsyncAwaited(flushTask, value); } @@ -128,7 +128,7 @@ public override Task WriteAsync(char[] buffer, int index, int count) // FlushAsyncCore will return CompletedTask if nothing sync buffered // Fast-path and skip async state-machine if only a single async operation - return ReferenceEquals(flushTask, Task.CompletedTask) ? + return flushTask.IsCompletedSuccessfully ? _inner.WriteAsync(buffer, index, count) : WriteAsyncAwaited(flushTask, buffer, index, count); } @@ -145,7 +145,7 @@ public override Task WriteAsync(string value) // FlushAsyncCore will return CompletedTask if nothing sync buffered // Fast-path and skip async state-machine if only a single async operation - return ReferenceEquals(flushTask, Task.CompletedTask) ? + return flushTask.IsCompletedSuccessfully ? _inner.WriteAsync(value) : WriteAsyncAwaited(flushTask, value); } diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.cs b/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.cs index ea0948d8e066..3f879207f2d6 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.cs @@ -767,7 +767,7 @@ private Task FireOnStartingMayAwait(Stack, objec while (onStarting.TryPop(out var entry)) { var task = entry.Key.Invoke(entry.Value); - if (!ReferenceEquals(task, Task.CompletedTask)) + if (!task.IsCompletedSuccessfully) { return FireOnStartingAwaited(task, onStarting); } @@ -817,7 +817,7 @@ private Task FireOnCompletedMayAwait(Stack, obje try { var task = entry.Key.Invoke(entry.Value); - if (!ReferenceEquals(task, Task.CompletedTask)) + if (!task.IsCompletedSuccessfully) { return FireOnCompletedAwaited(task, onCompleted); } @@ -953,8 +953,7 @@ public void ProduceContinue() public Task InitializeResponseAsync(int firstWriteByteCount) { var startingTask = FireOnStarting(); - // If return is Task.CompletedTask no awaiting is required - if (!ReferenceEquals(startingTask, Task.CompletedTask)) + if (!startingTask.IsCompletedSuccessfully) { return InitializeResponseAwaited(startingTask, firstWriteByteCount); } @@ -1397,8 +1396,7 @@ public ValueTask FlushPipeAsync(CancellationToken cancellationToken if (!HasResponseStarted) { var initializeTask = InitializeResponseAsync(0); - // If return is Task.CompletedTask no awaiting is required - if (!ReferenceEquals(initializeTask, Task.CompletedTask)) + if (!initializeTask.IsCompletedSuccessfully) { return FlushAsyncAwaited(initializeTask, cancellationToken); } @@ -1509,8 +1507,7 @@ private ValueTask FirstWriteAsync(ReadOnlyMemory data, Cancel Debug.Assert(!HasResponseStarted); var startingTask = FireOnStarting(); - - if (!ReferenceEquals(startingTask, Task.CompletedTask)) + if (!startingTask.IsCompletedSuccessfully) { return FirstWriteAsyncAwaited(startingTask, data, cancellationToken); } diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelConnection.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelConnection.cs index cfa274558c9f..9cbf8f12a1de 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelConnection.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelConnection.cs @@ -107,7 +107,7 @@ private Task CompleteAsyncMayAwait(Stack, object try { var task = entry.Key.Invoke(entry.Value); - if (!ReferenceEquals(task, Task.CompletedTask)) + if (!task.IsCompletedSuccessfully) { return CompleteAsyncAwaited(task, onCompleted); } From c89352b1647ad6398e741c5ac8f86279405dd222 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Thu, 27 Jun 2019 23:36:58 +0100 Subject: [PATCH 2/2] Feedback --- .../Mvc.ViewFeatures/src/Buffers/PagedBufferedTextWriter.cs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedBufferedTextWriter.cs b/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedBufferedTextWriter.cs index c523883b5f38..611a03f45c84 100644 --- a/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedBufferedTextWriter.cs +++ b/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedBufferedTextWriter.cs @@ -109,8 +109,6 @@ public override Task WriteAsync(char value) { var flushTask = FlushAsyncCore(); - // FlushAsyncCore will return CompletedTask if nothing sync buffered - // Fast-path and skip async state-machine if only a single async operation return flushTask.IsCompletedSuccessfully ? _inner.WriteAsync(value) : WriteAsyncAwaited(flushTask, value); @@ -126,8 +124,6 @@ public override Task WriteAsync(char[] buffer, int index, int count) { var flushTask = FlushAsyncCore(); - // FlushAsyncCore will return CompletedTask if nothing sync buffered - // Fast-path and skip async state-machine if only a single async operation return flushTask.IsCompletedSuccessfully ? _inner.WriteAsync(buffer, index, count) : WriteAsyncAwaited(flushTask, buffer, index, count); @@ -143,8 +139,6 @@ public override Task WriteAsync(string value) { var flushTask = FlushAsyncCore(); - // FlushAsyncCore will return CompletedTask if nothing sync buffered - // Fast-path and skip async state-machine if only a single async operation return flushTask.IsCompletedSuccessfully ? _inner.WriteAsync(value) : WriteAsyncAwaited(flushTask, value);