首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用通用主机IHostBuilder检测停靠点的关闭信号

使用通用主机IHostBuilder检测停靠点的关闭信号
EN

Stack Overflow用户
提问于 2020-07-08 12:35:54
回答 1查看 686关注 0票数 7

我有一个默认的通用主机生成器,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static IHostBuilder CreateDefaultBuilder(string[] args)
{
    var builder = Host.CreateDefaultBuilder(args);

    builder
        .ConfigureLogging((hostingContext, logging) =>
        {
            logging.ClearProviders();
            logging.AddConsole();
            if (hostingContext.HostingEnvironment.IsDevelopment() == true)
                logging.AddDebug();
        })
        .ConfigureHostConfiguration(configurationBuilder =>
        {
            configurationBuilder.AddCommandLine(args);
        })
        .ConfigureAppConfiguration((hostingContext, configApp) =>
        {
            var env = hostingContext.HostingEnvironment;
            Console.WriteLine(env.EnvironmentName);
        })
        .UseConsoleLifetime();

    return builder;
}

public static async Task Main(string[] args)
{
     var host = CreateDefaultBuilder(args)
                        .ConfigureServices((hostContext, services) =>
                        {
                            services.Configure<HostOptions>(option =>
                            {
                                option.ShutdownTimeout = System.TimeSpan.FromSeconds(20);
                            });

                            services.AddLogging();

                            services.AddSimpleInjector(container, options =>
                            {
                                // Hooks hosted services into the Generic Host pipeline while resolving them through Simple Injector
                                options.AddHostedService<Worker>();

                                // Allows injection of ILogger & IStringLocalizer dependencies into application components
                                options.AddLogging();
                                // options.AddLocalization();
                            });
                        })
                        .Build()
                        .UseSimpleInjector(container);

     config.Build();
     await host.RunAsync();
}

我使用UseConsoleLifetime和docker运行应用程序,它运行,但我似乎不能优雅地关闭。

我通过docker stop命令在PowerShell中优雅地向我的应用程序发送停止信号。

然而,不像我的控制台应用程序,我按control+C,应用程序没有得到这个停止命令,在10秒后被强制杀死。

我的问题是:

  1. 如何检测停靠程序关机命令?
  2. 如何根据调用的方法(通过控制台或停靠器)注册这两种关闭方法(有时,我可以在Visual中直接调试作为控制台,而大多数情况下,我会通过停靠器使用,但这两种情况下都可以自动注册)。

编辑和更新

我见过回复,谢谢,提到陷阱在AppDomain.CurrentDomain.ProcessExit上。

对于我的工作人员BackgroundService,接口是这样的,它具有以下功能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Worker : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
             logger.LogInformation("running at: {time} - stoppingToken {stoppingToken}", DateTimeOffset.Now, stoppingToken.IsCancellationRequested);
             await Task.Delay(1000, stoppingToken);
        }
    }
}

无论何时发送UseConsoleLifetime,都会使用ctrl+c设置stoppingToken。

当在坞内使用相同的代码(包括UseConsoleLifetime相同的代码)时,不会设置stoppingToken。

注意,为了执行取消,我无法看到我可以访问这个令牌源。

如果我注册到AppDomain.CurrentDomain.ProcessExit,我如何使用它来设置stoppingToken (与创建自己的停止令牌源相反,就像可以执行的那样,如果可能的话,希望避免)。

EN

回答 1

Stack Overflow用户

发布于 2020-07-08 12:42:07

docker stop向容器中的主进程发送SIGTERM信号。为了处理这个问题和优雅地关闭,您需要捕获这个信号并执行适当的终止代码。因此,This问题描述了如何附加响应此信号的事件处理程序。

请注意,如果不捕获此信号,停靠者将在超时后强制关闭容器(默认情况下为10秒)。

要处理这两个问题,您可以提取运行的任何清理代码,以便优雅地关闭一个函数,并从两个处理程序中调用它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62803245

复制
相关文章
为什么 build 方法放在 State 中而不是在 StatefulWidget 中
为什么 build 方法放在 State 中而不是在 StatefulWidget 中呢?其中前2点是源代码的注释中给出的原因,最后一点是我的一点个人理解。
老孟Flutter
2021/01/28
9130
Django 2.1.7 Admin - 列表页选项
https://docs.djangoproject.com/zh-hans/2.1/intro/tutorial07/
Devops海洋的渔夫
2019/07/08
1.1K0
Django 2.1.7 Admin - 列表页选项
39. Django 2.1.7 Admin - 列表页选项
1)打开assetinfo/admin.py文件,修改ServerInfoAdmin类如下:
Devops海洋的渔夫
2022/01/17
3880
39. Django 2.1.7 Admin - 列表页选项
WideNet:让网络更宽而不是更深
这是新加坡国立大学在2022 aaai发布的一篇论文。WideNet是一种参数有效的框架,它的方向是更宽而不是更深。通过混合专家(MoE)代替前馈网络(FFN),使模型沿宽度缩放。使用单独LN用于转换各种语义表示,而不是共享权重。
deephub
2023/08/30
2180
WideNet:让网络更宽而不是更深
在 Django Admin 后台发布文章
在此之前我们完成了 Django 博客首页视图的编写,我们希望首页展示发布的博客文章列表,但是它却抱怨:暂时还没有发布的文章!如它所言,我们确实还没有发布任何文章,本节我们将使用 Django 自带的 Admin 后台来发布我们的博客文章。 创建 Admin 后台管理员账户 要想进入Django Admin 后台,首先需要创建一个超级管理员账户。我们在 让 Django 完成翻译:迁移数据库 中已经创建了一个后台账户,但如果你没有按照前面的步骤创建账户的话,可以运行 python manage.py cre
追梦人物
2018/04/17
2.1K0
在 Django Admin 后台发布文章
Django之templatetags自定义标签和过滤器的使用
2、创建任意 .py 文件,如:myTag.py 3、myTag.py文件: from django import template from django.utils.safestring import mark_safe register = template.Library(); # register 不能改变
菲宇
2022/05/06
1.7K0
在django-admin中使用django-ckeditor
在最新学习python中,使用django搭建博客系统,管理后台直接使用django自带的admin模块,所以遇到富文本编辑的问题,经过查阅资料,发现了django-ckeditor这个小插件,下面小威就分享一点点来自小白的经验吧~
用户2619822
2022/06/10
1.6K0
在django-admin中使用django-ckeditor
Django 1.10中文文档-第一个应用Part7-自定义管理站点
目录[-] 开发第一个Django应用,Part7 本教程上接Part6。将继续完成这个投票应用,本节将着重讲解如果用Django自动生成后台管理网站。 自定义管理表单 通过admin.site.register(Question)注册了Question后,Django可以自动构建一个默认的表单。如果您需要自定义管理表单的外观和功能。你可以在注册时通过配置来实现。 现在先来试试重新排序表单上的字段。只需要将admin.site.register(Question)所在行替换为: # polls/admi
jhao104
2018/03/20
3.6K0
Django 1.10中文文档-第一个应用Part7-自定义管理站点
编程是一种思想,而不是敲代码
编程是一个先思考再编码的过程,思考是优于编码技能的,在思考过程中我们会考虑代码的可重用性、可靠性、更容易被他人理解,这时就会使用到设计模式让代码编写工程化,这篇文章整理了设计模式的六大原则。
新亮
2020/05/26
3750
编程是一种思想,而不是敲代码
如何修改django的app在admin中显示的名称
在django的开发中,很多时候我们希望app在admin中显示成我们想要的中文名,而不是显示默认的app_label名称。 比如我们有一个blog应用,在我们的blog app目录下面,默认会生成一个apps.py文件,类似:
小海怪的互联网
2019/09/25
3.4K0
如何修改django的app在admin中显示的名称
Django Admin后台管理
Django通过简单配置就可以实现数据模型的后台管理。一般管理界面是给系统管理员使用的,以完成数据的CURD。
菜菜cc
2022/11/15
2.8K0
Django Admin后台管理
Django3.2边学边记—Adimn站点管理
ModelAdmin类可以控制不同模型在Admin界面中的展示方式,主要包括在列表页的展示方式、添加修改页的展示方式
玖柒的小窝
2021/09/24
1.2K0
Django3.2边学边记—Adimn站点管理
什么在代码中要求我们使用LocalDateTime而不是Date?
在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗?
用户1516716
2019/11/24
1.1K0
在非admin页面使用 Django Ueditor(二)
Django Ueditor的安装和在admin页面的使用请看,接下来的内容是基于这篇文章的环境进行的:使用 Django Ueditor 富文本编辑器(一),如果你按照下面的流程来做还有关于Ueditor的报错,很有可能是没有装好环境。。 总体流程 以文章模型为例 1、创建文章模型 2、创建该文章模型的Form 3、写个html界面 4、写个视图函数article(),并提供这个Form给前端渲染 5、写个路由,并配置好settings.py文件 具体实现过程 在app中: 1、创建文章模型 from D
benny
2020/04/23
7060
在非admin页面使用 Django Ueditor(二)
Django快速入门——投票程序(7) 自定义后台
通过admin.site.register(Question)注册Question模型,Django会创建默认的表单在后台显示。但有时需要自定义后台的显示,可以通过继承admin.ModelAdmin实现:
一只大鸽子
2023/09/02
2420
Django快速入门——投票程序(7) 自定义后台
Django3.2边学边记—Adimn站点管理
ModelAdmin类可以控制不同模型在Admin界面中的展示方式,主要包括在列表页的展示方式、添加修改页的展示方式
用户1503405
2021/09/27
1.3K0
django admin 美化
django admin 美化主题,采用layui 作为基本框架,改写大部分页面 说明 安装 pip install django-simpleui 升级 pip install django-simpleui --upgrade 克隆源码本地安装 git clone https://github.com/newpanjing/simpleuicd simpleui python setup.py sdist install 项目 settings.py 的INSTALLED_APPS 第一行加入 simp
小贝壳
2020/03/05
7620
点击加载更多

相似问题

如何让文本显示在顶部而不是侧面?

20

有没有一种方法可以在模型中表达Django管理设置,而不是admin.py?

41

有没有一种方法可以使对象始终位于显示列表的顶部?

20

有没有一种方法可以从底部而不是从顶部在RecyclerView中堆叠CardView?

228

Django admin DoesNotExist位于/admin/

100
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文