From cf77999a3b6bdb9d861ca7bf157b1264d67f3130 Mon Sep 17 00:00:00 2001
From: Kahbazi <A.Kahbazi@gmail.com>
Date: Thu, 16 Jul 2020 19:46:39 +0430
Subject: [PATCH] Dispost CancellationTokenSource in WebHostExtensions (#23969)

---
 .../Hosting/ref/Microsoft.AspNetCore.Hosting.netcoreapp.cs   | 1 +
 src/Hosting/Hosting/src/WebHostExtensions.cs                 | 5 +++--
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/Hosting/Hosting/ref/Microsoft.AspNetCore.Hosting.netcoreapp.cs b/src/Hosting/Hosting/ref/Microsoft.AspNetCore.Hosting.netcoreapp.cs
index b87c115dead..0ed621abe17 100644
--- a/src/Hosting/Hosting/ref/Microsoft.AspNetCore.Hosting.netcoreapp.cs
+++ b/src/Hosting/Hosting/ref/Microsoft.AspNetCore.Hosting.netcoreapp.cs
@@ -50,6 +50,7 @@ namespace Microsoft.AspNetCore.Hosting
         public static void Run(this Microsoft.AspNetCore.Hosting.IWebHost host) { }
         [System.Diagnostics.DebuggerStepThroughAttribute]
         public static System.Threading.Tasks.Task RunAsync(this Microsoft.AspNetCore.Hosting.IWebHost host, System.Threading.CancellationToken token = default(System.Threading.CancellationToken)) { throw null; }
+        [System.Diagnostics.DebuggerStepThroughAttribute]
         public static System.Threading.Tasks.Task StopAsync(this Microsoft.AspNetCore.Hosting.IWebHost host, System.TimeSpan timeout) { throw null; }
         public static void WaitForShutdown(this Microsoft.AspNetCore.Hosting.IWebHost host) { }
         [System.Diagnostics.DebuggerStepThroughAttribute]
diff --git a/src/Hosting/Hosting/src/WebHostExtensions.cs b/src/Hosting/Hosting/src/WebHostExtensions.cs
index b1b317272bc..fe77b134432 100644
--- a/src/Hosting/Hosting/src/WebHostExtensions.cs
+++ b/src/Hosting/Hosting/src/WebHostExtensions.cs
@@ -19,9 +19,10 @@ namespace Microsoft.AspNetCore.Hosting
         /// <param name="timeout">The timeout for stopping gracefully. Once expired the
         /// server may terminate any remaining active connections.</param>
         /// <returns>A <see cref="Task"/> that completes when the <see cref="IWebHost"/> stops.</returns>
-        public static Task StopAsync(this IWebHost host, TimeSpan timeout)
+        public static async Task StopAsync(this IWebHost host, TimeSpan timeout)
         {
-            return host.StopAsync(new CancellationTokenSource(timeout).Token);
+            using var cts = new CancellationTokenSource(timeout);
+            await host.StopAsync(cts.Token);
         }
 
         /// <summary>
-- 
GitLab