В исходном коде время ожидания по умолчанию для 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);
}
}
}