Как установить ShutdownTimeout с помощью HostBuilder Общий хост ref StopAsync OperationCanceledException - PullRequest
0 голосов
/ 21 октября 2018

В исходном коде время ожидания по умолчанию для StopAsync составляет 5 секунд. WebHostBuilder предоставляет метод расширения Используйте ShutdownTimeout для простой настройки.Но такого эквивалента для HostBuilder не существует.

Я знаю, что, вероятно, злоупотребляю намерениями HostBuilder, желая превышения времени ожидания более 5 секунд, но это хорошая структура для управления набором взаимозависимых заданий.

Я бы очень признателен за некоторыеруководство о том, как с HostBuilder сделать то, что UseShutdownTimeout делает для WebHostBuilder, все еще работая с официальными пакетами NuGet.Я рассмотрел, возможно, расширение HostingAbstractionsHostBuilderExtensions , но это статический класс ...

Пример консольного приложения ниже для запуска события StopAsync OperationCanceledException.Просто Ctrl + C до истечения 10 секунд.

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);
        }

    }

}

1 Ответ

0 голосов
/ 21 октября 2018

Я получил ответ благодаря этому сообщению о SuppressStatusMessages

.ConfigureServices((hostContext, services) =>
    {
    services.Configure<HostOptions>(o => o.ShutdownTimeout = TimeSpan.FromSeconds(90));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...