/// <summary>
        /// Returns a Task that completes when shutdown is triggered via the given token, Ctrl+C or SIGTERM.
        /// </summary>
        /// <param name="host">The running <see cref="T:Microsoft.AspNetCore.Hosting.IWebHost" />.</param>
        /// <param name="token">The token to trigger shutdown.</param>
        /// <param name="runSuccessCallback">启动成功的回调函数(Run the successful callback)</param>
        public static async Task WaitForShutdownAsync(this IWebHost host, CancellationToken token = default(CancellationToken), Action runSuccessCallback = null)
        {
            ManualResetEventSlim done = new ManualResetEventSlim(false);

            using (CancellationTokenSource cts = CancellationTokenSource.CreateLinkedTokenSource(token))
            {
                EWebHostExtensions.AttachCtrlcSigtermShutdown(cts, done, string.Empty);
                await host.WaitForTokenShutdownAsync(cts.Token, runSuccessCallback);

                done.Set();
            }
        }
        /// <summary>
        /// Runs a web application and returns a Task that only completes when the token is triggered or shutdown is triggered.
        /// </summary>
        /// <param name="host">The <see cref="T:Microsoft.AspNetCore.Hosting.IWebHost" /> to run.</param>
        /// <param name="token">The token to trigger shutdown.</param>
        /// <param name="runSuccessCallback">启动成功的回调函数(Run the successful callback)</param>
        public static async Task RunAsync(this IWebHost host, CancellationToken token = default(CancellationToken), Action runSuccessCallback = null)
        {
            if (token.CanBeCanceled)
            {
                await host.RunAsync(token, (string)null, runSuccessCallback);
            }
            else
            {
                ManualResetEventSlim done = new ManualResetEventSlim(false);
                using (CancellationTokenSource cts = new CancellationTokenSource())
                {
                    EWebHostExtensions.AttachCtrlcSigtermShutdown(cts, done, host.Services.GetRequiredService <WebHostOptions>().SuppressStatusMessages ? string.Empty : "Application is shutting down...");

                    await host.RunAsync(
                        cts.Token,
                        "Application started. Press Ctrl+C to shut down.",
                        runSuccessCallback);

                    done.Set();
                }
            }
        }