首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优雅关闭和当前处理请求

优雅关闭和当前处理请求
EN

Stack Overflow用户
提问于 2018-07-23 15:54:14
回答 2查看 5.4K关注 0票数 4

我正在为ASP.NET Core2.1进行优雅的关闭。我注意到,在控制器上运行的所有请求都将在优雅的关机启动后立即取消。即使我希望在容器被释放之前成功地完成所有请求。

IApplicationLifetime https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.hosting.iapplicationlifetime?view=aspnetcore-2.1

当应用程序主机执行优雅的关闭时触发ApplicationStopping。请求可能仍在飞行中。关闭将阻止此事件,直到此事件结束。

在完成所有当前请求之前,我能做些什么来防止处理呢?

示例:

代码语言:javascript
复制
public static void Main(string[] args) { 
    WebHostExtensions.Run(BuildWebHost(args));
}

private static IWebHost BuildWebHost(string[] args) {
    return WebHostExtensions.CreateDefaultBuilder(args)
        .UseSerilog()
        .UseStartup<Startup>()
        .UseUrls("http://0.0.0.0:9100")
        .Build();
}

主计长:

代码语言:javascript
复制
public class UserOrdersController : Controller
{
     public async Task<IActionResult> GetUserOrders(string productId)
     {
         await Task.Delay(5000);
         Console.WriteLine("Finished");
         //.....................................
     }        
}

因此,如果我要求执行优雅的关闭操作,“已完成”将不会被打印为

UPD:在构建器中添加了.UseShutdownTimeout(TimeSpan.FromSeconds(10)),但没有帮助。

EN

回答 2

Stack Overflow用户

发布于 2018-08-09 17:33:22

就像其他人提到的,你想要的行为应该立即发生。SIGINT应该触发一个优雅的关闭。我有一种感觉,您正在通过运行一个比web主机的默认关机超时值更长的Task.Delay来进行测试。这将导致触发超时,这将杀死所有当前正在运行的请求。

设置web主机关闭超时,如下所示:

代码语言:javascript
复制
public class Program
{
  public static void Main(string[] args)
  {
    CreateWebHostBuilder(args).Build().Run();
  }

  public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
      WebHost.CreateDefaultBuilder(args)
      .UseShutdownTimeout(TimeSpan.FromSeconds(60)) // set timeout value here
          .UseStartup<Startup>();
  }
}
票数 3
EN

Stack Overflow用户

发布于 2018-07-25 21:15:36

我建议执行传入IWebHost.RunAsync的CancellationToken,以便当SIGINT和Ctrl+C命令发送到您的应用程序时,您可以拦截和取消令牌,这将导致应用程序的优雅关闭。

请参见以下代码示例:

代码语言:javascript
复制
public class Program
{
    private static readonly CancellationTokenSource cts = new CancellationTokenSource();

    protected Program()
    {
    }

    public static int Main(string[] args)
    {
        Console.CancelKeyPress += OnExit;
        return RunHost(configuration).GetAwaiter().GetResult();
    }

    protected static void OnExit(object sender, ConsoleCancelEventArgs args)
    {
        cts.Cancel();
    }

    static async Task<int> RunHost()
    {
        await new WebHostBuilder()
            .UseStartup<Startup>()
            .Build()
            .RunAsync(cts.Token);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51482858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档