【问题标题】:How to set ShutdownTimeout using HostBuilder Generic Host ref StopAsync OperationCanceledException如何使用 HostBuilder Generic Host ref StopAsync OperationCanceledException 设置 ShutdownTimeout
【发布时间】:2018-10-22 06:17:58
【问题描述】:

查看source code,StopAsync 的默认超时为 5 秒。 WebHostBuilder 提供了一个扩展方法UseShutdownTimeout,方便设置。但是HostBuilder 不存在这样的等价物

我知道我想要超过 5 秒的超时时间可能是在滥用 HostBuilder 的意图,但它是一个很好的框架来管理相互依赖的作业集合。

我非常感谢一些关于如何使用 HostBuilder 的指导,就像 UseShutdownTimeout 对 WebHostBuilder 所做的那样,同时仍然使用官方 NuGet 包。我看过可能扩展 HostingAbstractionsHostBuilderExtensions 但它是一个静态类...

下面的示例控制台应用程序用于触发 StopAsync OperationCanceledException 事件。只需在 10 秒结束前按 Ctrl+C。

using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace StackOverflow_GenericHost_StopAsync
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var host = new HostBuilder()                
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddSingleton<IHostedService, MustRunToCompletionService>();
                })

                .Build();


            await host.StartAsync();

            try
            {
                await host.WaitForShutdownAsync();
            }
            catch (OperationCanceledException ex)
            {
                // We have completed a controlled shutdown but the Exception is ugly
                Console.WriteLine(ex);
                Console.ReadKey();
            }

            // just hangs if we don't
            host.Dispose();

        }
    }

    class MustRunToCompletionService : IHostedService 
    {
        private Task _longRunningTask;

        private async Task MustCompleteProcess()
        {
            // simulate long running job
            Thread.Sleep(15000);
        }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            _longRunningTask = Task.Run(MustCompleteProcess);
            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            // ignore cancellationToken, I really need this to run to completion
            return Task.WhenAll(_longRunningTask);
        }

    }

}

【问题讨论】:

  • 在您的情况下,使用在创建时或首次使用之前使用 host.StartAsync() 调用来包装 HostBuilder 实例。例如,如果您无法调用 dispose 在底部的位置。

标签: c# multithreading asp.net-core-2.1


【解决方案1】:

感谢这篇关于SuppressStatusMessages的帖子,我得到了答案

.ConfigureServices((hostContext, services) =>
    {
    services.Configure<HostOptions>(o => o.ShutdownTimeout = TimeSpan.FromSeconds(90));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多