From b08163d3b7bbc5e599bb895e49ad9d2abd67b848 Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Tue, 29 May 2018 16:07:41 -0700 Subject: [PATCH] [2.1.1] Use TaskCreationOptions.RunContinuationsAsynchronously a lot (#2618) --- .../ConnectionLimitTests.cs | 12 ++-- .../HttpConnectionManagerTests.cs | 2 +- test/Kestrel.FunctionalTests/HttpsTests.cs | 6 +- .../MaxRequestBufferSizeTests.cs | 8 +-- test/Kestrel.FunctionalTests/RequestTests.cs | 32 +++++----- test/Kestrel.FunctionalTests/ResponseTests.cs | 62 +++++++++---------- .../HostNameIsReachableAttribute.cs | 2 +- test/Kestrel.FunctionalTests/UpgradeTests.cs | 10 +-- .../ListenerPrimaryTests.cs | 2 +- test/shared/TestConnection.cs | 2 +- 10 files changed, 66 insertions(+), 72 deletions(-) diff --git a/test/Kestrel.FunctionalTests/ConnectionLimitTests.cs b/test/Kestrel.FunctionalTests/ConnectionLimitTests.cs index 8462050e36..3aa1ad90f5 100644 --- a/test/Kestrel.FunctionalTests/ConnectionLimitTests.cs +++ b/test/Kestrel.FunctionalTests/ConnectionLimitTests.cs @@ -22,9 +22,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests [Fact] public async Task ResetsCountWhenConnectionClosed() { - var requestTcs = new TaskCompletionSource(); - var releasedTcs = new TaskCompletionSource(); - var lockedTcs = new TaskCompletionSource(); + var requestTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var releasedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var lockedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var counter = new EventRaisingResourceCounter(ResourceCounter.Quota(1)); counter.OnLock += (s, e) => lockedTcs.TrySetResult(e); counter.OnRelease += (s, e) => releasedTcs.TrySetResult(null); @@ -95,7 +95,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests public async Task RejectsConnectionsWhenLimitReached() { const int max = 10; - var requestTcs = new TaskCompletionSource(); + var requestTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (var server = CreateServerWithMaxConnections(async context => { @@ -140,8 +140,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests const int count = 100; var opened = 0; var closed = 0; - var openedTcs = new TaskCompletionSource(); - var closedTcs = new TaskCompletionSource(); + var openedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var closedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var counter = new EventRaisingResourceCounter(ResourceCounter.Quota(uint.MaxValue)); diff --git a/test/Kestrel.FunctionalTests/HttpConnectionManagerTests.cs b/test/Kestrel.FunctionalTests/HttpConnectionManagerTests.cs index 7f5296763c..ef8ac428b1 100644 --- a/test/Kestrel.FunctionalTests/HttpConnectionManagerTests.cs +++ b/test/Kestrel.FunctionalTests/HttpConnectionManagerTests.cs @@ -42,7 +42,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests using (var server = new TestServer(context => { appStartedWh.Release(); - var tcs = new TaskCompletionSource(); + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); return tcs.Task; }, new TestServiceContext(new LoggerFactory(), mockTrace.Object))) diff --git a/test/Kestrel.FunctionalTests/HttpsTests.cs b/test/Kestrel.FunctionalTests/HttpsTests.cs index b20b3c5874..30ae3470ed 100644 --- a/test/Kestrel.FunctionalTests/HttpsTests.cs +++ b/test/Kestrel.FunctionalTests/HttpsTests.cs @@ -253,7 +253,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests [Fact] public async Task DoesNotThrowObjectDisposedExceptionFromWriteAsyncAfterConnectionIsAborted() { - var tcs = new TaskCompletionSource(); + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var loggerProvider = new HandshakeErrorLoggerProvider(); LoggerFactory.AddProvider(loggerProvider); var hostBuilder = TransportSelector.GetWebHostBuilder() @@ -441,13 +441,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests { public LogLevel LastLogLevel { get; set; } public EventId LastEventId { get; set; } - public TaskCompletionSource LogTcs { get; } = new TaskCompletionSource(); + public TaskCompletionSource LogTcs { get; } = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) { LastLogLevel = logLevel; LastEventId = eventId; - Task.Run(() => LogTcs.SetResult(null)); + LogTcs.SetResult(null); } public bool IsEnabled(LogLevel logLevel) diff --git a/test/Kestrel.FunctionalTests/MaxRequestBufferSizeTests.cs b/test/Kestrel.FunctionalTests/MaxRequestBufferSizeTests.cs index 93919845ea..64522f2202 100644 --- a/test/Kestrel.FunctionalTests/MaxRequestBufferSizeTests.cs +++ b/test/Kestrel.FunctionalTests/MaxRequestBufferSizeTests.cs @@ -89,8 +89,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests // Initialize data with random bytes (new Random()).NextBytes(data); - var startReadingRequestBody = new TaskCompletionSource(); - var clientFinishedSendingRequestBody = new TaskCompletionSource(); + var startReadingRequestBody = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var clientFinishedSendingRequestBody = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var lastBytesWritten = DateTime.MaxValue; using (var host = StartWebHost(maxRequestBufferSize, data, connectionAdapter, startReadingRequestBody, clientFinishedSendingRequestBody)) @@ -181,8 +181,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests var bytesWrittenPollingInterval = TimeSpan.FromMilliseconds(bytesWrittenTimeout.TotalMilliseconds / 10); var maxSendSize = 4096; - var startReadingRequestBody = new TaskCompletionSource(); - var clientFinishedSendingRequestBody = new TaskCompletionSource(); + var startReadingRequestBody = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var clientFinishedSendingRequestBody = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var lastBytesWritten = DateTime.MaxValue; using (var host = StartWebHost(16 * 1024, data, false, startReadingRequestBody, clientFinishedSendingRequestBody)) diff --git a/test/Kestrel.FunctionalTests/RequestTests.cs b/test/Kestrel.FunctionalTests/RequestTests.cs index 3f82426e5f..7d01075fc4 100644 --- a/test/Kestrel.FunctionalTests/RequestTests.cs +++ b/test/Kestrel.FunctionalTests/RequestTests.cs @@ -578,8 +578,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests public async Task ConnectionClosedTokenFiresOnClientFIN(ListenOptions listenOptions) { var testContext = new TestServiceContext(LoggerFactory); - var appStartedTcs = new TaskCompletionSource(); - var connectionClosedTcs = new TaskCompletionSource(); + var appStartedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var connectionClosedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (var server = new TestServer(context => { @@ -613,7 +613,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests public async Task ConnectionClosedTokenFiresOnServerFIN(ListenOptions listenOptions) { var testContext = new TestServiceContext(LoggerFactory); - var connectionClosedTcs = new TaskCompletionSource(); + var connectionClosedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (var server = new TestServer(context => { @@ -649,7 +649,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests public async Task ConnectionClosedTokenFiresOnServerAbort(ListenOptions listenOptions) { var testContext = new TestServiceContext(LoggerFactory); - var connectionClosedTcs = new TaskCompletionSource(); + var connectionClosedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (var server = new TestServer(context => { @@ -694,9 +694,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests [InlineData("http://localhost/path%20with%20space?q=abc%20123", "/path with space", "abc 123")] public async Task CanHandleRequestsWithUrlInAbsoluteForm(string requestUrl, string expectedPath, string queryValue) { - var pathTcs = new TaskCompletionSource(); - var rawTargetTcs = new TaskCompletionSource(); - var queryTcs = new TaskCompletionSource(); + var pathTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var rawTargetTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var queryTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (var server = new TestServer(async context => { @@ -1135,8 +1135,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests { var testContext = new TestServiceContext(LoggerFactory); - var readTcs = new TaskCompletionSource(); - var registrationTcs = new TaskCompletionSource(); + var readTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var registrationTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var requestId = 0; using (var server = new TestServer(async httpContext => @@ -1217,10 +1217,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests const int connectionFinSentEventId = 7; const int maxRequestBufferSize = 4096; - var readCallbackUnwired = new TaskCompletionSource(TaskContinuationOptions.RunContinuationsAsynchronously); - var clientClosedConnection = new TaskCompletionSource(TaskContinuationOptions.RunContinuationsAsynchronously); - var serverClosedConnection = new TaskCompletionSource(TaskContinuationOptions.RunContinuationsAsynchronously); - var appFuncCompleted = new TaskCompletionSource(TaskContinuationOptions.RunContinuationsAsynchronously); + var readCallbackUnwired = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var clientClosedConnection = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var serverClosedConnection = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var appFuncCompleted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var mockLogger = new Mock(); mockLogger @@ -1276,9 +1276,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests await serverClosedConnection.Task; - // TaskContinuationOptions.RunContinuationsAsynchronously sometimes runs inline anyway in - // situations such as this where the awaiter starts awaiting right when SetResult is called. - _ = Task.Run(() => appFuncCompleted.SetResult(null)); + appFuncCompleted.SetResult(null); }, testContext, listenOptions)) { using (var connection = server.CreateConnection()) @@ -1308,7 +1306,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests [MemberData(nameof(ConnectionAdapterData))] public async Task AppCanHandleClientAbortingConnectionMidRequest(ListenOptions listenOptions) { - var readTcs = new TaskCompletionSource(TaskContinuationOptions.RunContinuationsAsynchronously); + var readTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var mockKestrelTrace = new Mock(Logger) { CallBase = true }; var testContext = new TestServiceContext() diff --git a/test/Kestrel.FunctionalTests/ResponseTests.cs b/test/Kestrel.FunctionalTests/ResponseTests.cs index 3e7f4b7d58..d652b8aff4 100644 --- a/test/Kestrel.FunctionalTests/ResponseTests.cs +++ b/test/Kestrel.FunctionalTests/ResponseTests.cs @@ -145,7 +145,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests public async Task OnCompleteCalledEvenWhenOnStartingNotCalled() { var onStartingCalled = false; - var onCompletedTcs = new TaskCompletionSource(); + var onCompletedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var hostBuilder = TransportSelector.GetWebHostBuilder() .UseKestrel() @@ -341,7 +341,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests [Fact] public async Task OnCompletedShouldNotBlockAResponse() { - var delayTcs = new TaskCompletionSource(); + var delayTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var hostBuilder = TransportSelector.GetWebHostBuilder() .UseKestrel() .UseUrls("http://127.0.0.1:0/") @@ -375,7 +375,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests [Fact] public async Task InvalidChunkedEncodingInRequestShouldNotBlockOnCompleted() { - var onCompletedTcs = new TaskCompletionSource(); + var onCompletedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (var server = new TestServer(httpContext => { @@ -418,7 +418,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests mockHttpContextFactory.Setup(f => f.Create(It.IsAny())) .Returns(fc => new DefaultHttpContext(fc)); - var disposedTcs = new TaskCompletionSource(); + var disposedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); mockHttpContextFactory.Setup(f => f.Dispose(It.IsAny())) .Callback(c => { @@ -619,7 +619,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests { const string response = "hello, world"; - var logTcs = new TaskCompletionSource(); + var logTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var mockKestrelTrace = new Mock(); mockKestrelTrace .Setup(trace => trace.ConnectionHeadResponseBodyWrite(It.IsAny(), response.Length)) @@ -808,7 +808,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests [Fact] public async Task WhenAppWritesLessThanContentLengthErrorLogged() { - var logTcs = new TaskCompletionSource(); + var logTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var mockTrace = new Mock(); mockTrace .Setup(trace => trace.ApplicationError(It.IsAny(), It.IsAny(), It.IsAny())) @@ -1182,7 +1182,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests { var connectionClosed = new ManualResetEventSlim(); var requestStarted = new ManualResetEventSlim(); - var tcs = new TaskCompletionSource(); + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (var server = new TestServer(async httpContext => { @@ -2279,7 +2279,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests // Ensure string is long enough to disable write-behind buffering var largeString = new string('a', maxBytesPreCompleted + 1); - var writeTcs = new TaskCompletionSource(); + var writeTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var requestAbortedWh = new ManualResetEventSlim(); var requestStartWh = new ManualResetEventSlim(); @@ -2336,9 +2336,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests const int maxRequestBufferSize = 2048; var requestAborted = false; - var readCallbackUnwired = new TaskCompletionSource(TaskContinuationOptions.RunContinuationsAsynchronously); - var clientClosedConnection = new TaskCompletionSource(TaskContinuationOptions.RunContinuationsAsynchronously); - var writeTcs = new TaskCompletionSource(TaskContinuationOptions.RunContinuationsAsynchronously); + var readCallbackUnwired = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var clientClosedConnection = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var writeTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var mockKestrelTrace = new Mock(Logger) { CallBase = true }; var mockLogger = new Mock(); @@ -2401,9 +2401,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests } catch (Exception ex) { - // TaskContinuationOptions.RunContinuationsAsynchronously sometimes runs inline anyway in - // situations such as this where the awaiter starts awaiting right when SetResult is called. - _ = Task.Run(() => writeTcs.SetException(ex)); + writeTcs.SetException(ex); throw; } @@ -2443,7 +2441,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests const int responseBodySize = responseBodySegmentSize * responseBodySegmentCount; var requestAborted = false; - var appCompletedTcs = new TaskCompletionSource(TaskContinuationOptions.RunContinuationsAsynchronously); + var appCompletedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var mockKestrelTrace = new Mock(Logger) { CallBase = true }; var testContext = new TestServiceContext() @@ -2474,9 +2472,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests { // WriteAsync shouldn't throw without a CancellationToken passed in. Unfortunately a ECONNRESET UvException sometimes gets thrown. // This will be fixed by https://github.com/aspnet/KestrelHttpServer/pull/2547 - // TaskContinuationOptions.RunContinuationsAsynchronously sometimes runs inline anyway in - // situations such as this where the awaiter starts awaiting right when SetResult is called. - _ = Task.Run(() => appCompletedTcs.SetResult(null)); + appCompletedTcs.SetResult(null); } }, testContext, listenOptions)) { @@ -2623,7 +2619,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests var testContext= new TestServiceContext(LoggerFactory); var callOrder = new Stack(); - var onStartingTcs = new TaskCompletionSource(); + var onStartingTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (var server = new TestServer(async context => { @@ -2675,7 +2671,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests var testContext= new TestServiceContext(LoggerFactory); var callOrder = new Stack(); - var onCompletedTcs = new TaskCompletionSource(); + var onCompletedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (var server = new TestServer(async context => { @@ -2819,10 +2815,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests var responseSize = chunks * chunkSize; var chunkData = new byte[chunkSize]; - var responseRateTimeoutMessageLogged = new TaskCompletionSource(); - var connectionStopMessageLogged = new TaskCompletionSource(); - var requestAborted = new TaskCompletionSource(); - var appFuncCompleted = new TaskCompletionSource(); + var responseRateTimeoutMessageLogged = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var connectionStopMessageLogged = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var requestAborted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var appFuncCompleted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var mockKestrelTrace = new Mock(); mockKestrelTrace @@ -2910,10 +2906,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests var certificate = new X509Certificate2(TestResources.TestCertificatePath, "testPassword"); - var responseRateTimeoutMessageLogged = new TaskCompletionSource(); - var connectionStopMessageLogged = new TaskCompletionSource(); - var aborted = new TaskCompletionSource(); - var appFuncCompleted = new TaskCompletionSource(); + var responseRateTimeoutMessageLogged = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var connectionStopMessageLogged = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var aborted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var appFuncCompleted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var mockKestrelTrace = new Mock(); mockKestrelTrace @@ -3002,10 +2998,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests var responseSize = bufferCount * bufferSize; var buffer = new byte[bufferSize]; - var responseRateTimeoutMessageLogged = new TaskCompletionSource(); - var connectionStopMessageLogged = new TaskCompletionSource(); - var requestAborted = new TaskCompletionSource(); - var appFuncCompleted = new TaskCompletionSource(); + var responseRateTimeoutMessageLogged = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var connectionStopMessageLogged = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var requestAborted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var appFuncCompleted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var mockKestrelTrace = new Mock(); mockKestrelTrace @@ -3089,7 +3085,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests var chunkData = new byte[chunkSize]; var requestAborted = false; - var appFuncCompleted = new TaskCompletionSource(); + var appFuncCompleted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var mockKestrelTrace = new Mock(); var testContext = new TestServiceContext diff --git a/test/Kestrel.FunctionalTests/TestHelpers/HostNameIsReachableAttribute.cs b/test/Kestrel.FunctionalTests/TestHelpers/HostNameIsReachableAttribute.cs index bd120b6356..5a83bd7c3f 100644 --- a/test/Kestrel.FunctionalTests/TestHelpers/HostNameIsReachableAttribute.cs +++ b/test/Kestrel.FunctionalTests/TestHelpers/HostNameIsReachableAttribute.cs @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests public static async Task ConnectToHost(string hostName, int port) { - var tcs = new TaskCompletionSource(); + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var socketArgs = new SocketAsyncEventArgs(); socketArgs.RemoteEndPoint = new DnsEndPoint(hostName, port); diff --git a/test/Kestrel.FunctionalTests/UpgradeTests.cs b/test/Kestrel.FunctionalTests/UpgradeTests.cs index 6a839aaad3..d7a0f5073f 100644 --- a/test/Kestrel.FunctionalTests/UpgradeTests.cs +++ b/test/Kestrel.FunctionalTests/UpgradeTests.cs @@ -19,7 +19,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests [Fact] public async Task ResponseThrowsAfterUpgrade() { - var upgrade = new TaskCompletionSource(); + var upgrade = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (var server = new TestServer(async context => { var feature = context.Features.Get(); @@ -58,7 +58,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests const string send = "Custom protocol send"; const string recv = "Custom protocol recv"; - var upgrade = new TaskCompletionSource(); + var upgrade = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (var server = new TestServer(async context => { try @@ -109,7 +109,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests [Fact] public async Task UpgradeCannotBeCalledMultipleTimes() { - var upgradeTcs = new TaskCompletionSource(); + var upgradeTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (var server = new TestServer(async context => { var feature = context.Features.Get(); @@ -217,7 +217,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests [Fact] public async Task ThrowsWhenUpgradingNonUpgradableRequest() { - var upgradeTcs = new TaskCompletionSource(); + var upgradeTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); using (var server = new TestServer(async context => { var feature = context.Features.Get(); @@ -251,7 +251,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests public async Task RejectsUpgradeWhenLimitReached() { const int limit = 10; - var upgradeTcs = new TaskCompletionSource(); + var upgradeTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var serviceContext = new TestServiceContext(LoggerFactory); serviceContext.ConnectionManager = new HttpConnectionManager(serviceContext.Log, ResourceCounter.Quota(limit)); diff --git a/test/Kestrel.Transport.Libuv.Tests/ListenerPrimaryTests.cs b/test/Kestrel.Transport.Libuv.Tests/ListenerPrimaryTests.cs index fa4198ccb4..2d906fc2cf 100644 --- a/test/Kestrel.Transport.Libuv.Tests/ListenerPrimaryTests.cs +++ b/test/Kestrel.Transport.Libuv.Tests/ListenerPrimaryTests.cs @@ -140,7 +140,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Tests Assert.Equal("Primary", await HttpClientSlim.GetStringAsync(address)); // Create a pipe connection and keep it open without sending any data - var connectTcs = new TaskCompletionSource(); + var connectTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var connectionTrace = new LibuvTrace(new TestApplicationErrorLogger()); var pipe = new UvPipeHandle(connectionTrace); diff --git a/test/shared/TestConnection.cs b/test/shared/TestConnection.cs index 4f65da6bcf..85e82590c0 100644 --- a/test/shared/TestConnection.cs +++ b/test/shared/TestConnection.cs @@ -217,7 +217,7 @@ namespace Microsoft.AspNetCore.Testing public Task WaitForConnectionClose() { - var tcs = new TaskCompletionSource(); + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var eventArgs = new SocketAsyncEventArgs(); eventArgs.SetBuffer(new byte[128], 0, 128); eventArgs.Completed += ReceiveAsyncCompleted;