Worker 服务意外停止工作

2023-12-08

我有 .NET Core 3+ 辅助服务,每 10 秒检查“一些内容”。有一次,它“随机”停止这样做,我不确定为什么。到目前为止,它发生了两次,并且没有异常日志或类似的东西,所以我只能假设我应该添加一个try-catch在 ExecuteAsync 内部,但我的问题是:是否有任何已知问题可能导致工作人员停止执行的类似行为?

是的,没有取消请求(否则,我想它会记录消息“发件人正在停止”)。

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;

    public Worker(ILogger<Worker> logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("Sender is starting");
        stoppingToken.Register(() => _logger.LogInformation("Sender is stopping"));

        while (!stoppingToken.IsCancellationRequested)
        {
            await Task.Delay(10000, stoppingToken);

            _logger.LogDebug("Worker running at: {time}", DateTimeOffset.Now);

            if (!stoppingToken.IsCancellationRequested)
                await SendPendingMessages();
        }
    }

    private async Task SendPendingMessages()
    {
        var list = ...

        foreach (var item in list)
        {
            try
            {
                // Do stuff as expected
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);
            }
        }
    }
}

到目前为止,它发生了两次,并且没有异常日志或类似的东西,所以我只能假设我应该在 ExecuteAsync 中添加一个 try-catch,但我的问题是:是否有任何已知问题可能导致类似的行为,其中工人就停止执行?

对我来说这听起来确实是个例外。默认情况下,the BackgroundService实施将ignore抛出的任何异常ExecuteAsync。如果引发异常ExecuteAsync,它会被忽略,并且服务会停止运行。

我总是推荐顶级的try/catch通过日志记录,这样您至少知道发生了这种情况:


protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
  _logger.LogInformation("Sender is starting");
  try
  {
    while (!stoppingToken.IsCancellationRequested)
    {
      await Task.Delay(10000, stoppingToken);
      _logger.LogDebug("Worker running at: {time}", DateTimeOffset.Now);
      if (!stoppingToken.IsCancellationRequested)
        await SendPendingMessages();
    }
  }
  catch (Exception ex) when (stoppingToken.IsCancellationRequested)
  {
    _logger.LogInformation("Sender is stopping");
  }
  catch (Exception ex) when (!stoppingToken.IsCancellationRequested)
  {
    _logger.LogError(ex, "Sender had error");
  }
}
  

与此相关的是,如果这是您认为的“关键”后台服务,那么您还需要当该服务停止时停止应用程序主机:


private readonly ILogger<Worker> _logger;
private readonly IHostApplicationLifetime _hostApplicationLifetime;

public Worker(ILogger<Worker> logger, IHostApplicationLifetime hostApplicationLifetime)
{
  _logger = logger;
  _hostApplicationLifetime = hostApplicationLifetime;
}

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
  _logger.LogInformation("Sender is starting");
  try
  {
    while (!stoppingToken.IsCancellationRequested)
    {
      await Task.Delay(10000, stoppingToken);
      _logger.LogDebug("Worker running at: {time}", DateTimeOffset.Now);
      if (!stoppingToken.IsCancellationRequested)
        await SendPendingMessages();
    }
  }
  catch (Exception ex) when (stoppingToken.IsCancellationRequested)
  {
    _logger.LogInformation("Sender is stopping");
  }
  catch (Exception ex) when (!stoppingToken.IsCancellationRequested)
  {
    _logger.LogError(ex, "Sender had error");
  }
  finally
  {
    _hostApplicationLifetime.StopApplication();
  }
}
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Worker 服务意外停止工作 的相关文章

  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 将 AnsiString 转换为 Unicode 字符串

    我正在将 D2006 程序转换为 D2010 我的数据库中每个字符串都有一个字节存储的值 我需要将其加载到具有 LoadFromStream 的控件中 因此我的计划是将字符串写入流并与 LoadFromStream 一起使用 但这没有用 在
  • C++ 中的字符串和 int 连接[重复]

    这个问题在这里已经有答案了 string words 5 for int i 0 i lt 5 i words i word i for int i 0 i lt 5 i cout lt
  • Angular 12索引html生成失败错误

    使用以下命令升级到 Angular 12ng update angular core 12 angular cli 12导致我在编译时出现以下错误 configuration production mode Index html gener
  • R动画绘图:线图不绘制线

    我正在尝试使用我自己的数据在 R 中创建动画绘图线图 当我使用标记作为 模式 时 动画有效 但是 当将模式更改为 线 或 线 时 图表上没有显示任何内容 有什么建议么 Data CH4 X FIRST SECOND 1 1 23 9 71
  • 如何编写 setup.py 以包含 Git 存储库作为依赖项

    我正在尝试写setup py为了我的包裹 我的包需要指定对另一个 Git 存储库的依赖关系 这是我到目前为止所拥有的 from setuptools import setup find packages setup name abc pac
  • 如何将多轨迹图制作为可重用代码?

    我以某种方式尝试为例如 bar graph 制作可重用的绘图代码 def bar x y text marker orientation name barchart go Bar x x y y text text marker marke
  • Shopify 标签总数

    在 Shopify 中 如何显示标签列表 后跟带有该标签的产品数量 示例 黑色 12 蓝色 10 目前代码看起来像这样 但它不起作用 ul for tag in collection all tags li a href tag a tag
  • AS3 和 JSON:错误 1061

    我花了几个小时来解决一个与 FLASH 中 JSON 编码相关的可能愚蠢的问题 我尝试做一些非常简单的事情 我创建一个对象 并希望它以 JSON 序列化 但Flash告诉我 gt 1061 Call to a possibly undefi
  • 可可中 NSColors 的问题

    我正在尝试使用 NSColor 组合颜色 当我尝试使用以下值创建 RGB 颜色时 它只显示白色 r g b 50 50 50 r g b 100 100 100 r g b 150 150 150 r g b 200 200 200 etc
  • 在选择查询中显示行号

    这个查询有什么问题 它在 rowno 列中显示 null SELECT rowno rowno 1 rn id title topic FROM stories SELECT rownum 0 r WHERE newstype 2 我在 M
  • Networkx问题:需要安装Graphviz / Pygraphviz(Anaconda 2021.11,WIN10x64)

    我在用着Jupyter Notebook进行图形分析 我需要使用Networkx要生成 MultiDiGraph 我需要将其绘制为树 但出现错误 from networkx drawing nx agraph import write do
  • gdb python:遍历结构数组

    我们不能遍历结构体数组吗 我的意思是对于每个索引 通过检查结构的内容并相应地打印每个字段 正如我们可以对这样的结构做的事情 s gdb parse and eval expr for k in s type keys v s k if is
  • 提取二进制矩阵中值为 1 的列名称

    我有个问题 我想从结构如下的二进制矩阵开始创建一个新矩阵 A B C D E F G 0 0 1 1 0 0 H 0 0 0 1 1 0 I 0 0 0 0 1 0 L 1 1 0 0 0 0 我想创建一个新矩阵由起始行的行名称和一个名为
  • WP7 - 根据设置动态更改启动页面

    是否可以根据 Windows Phone 7 应用程序中的设置更改启动页面 例如 一个有 2 个页面的应用程序 比如说电影和新闻 我希望用户能够在启动应用程序时选择他们想要首先显示的两个页面中的哪一个 现在 我试图通过在启动时导航到正确的页
  • 显示表行如何表现得像 colspan=3

    我需要两行 第一行有 3 列 第二行我需要跨越所有宽度 就像td colspan 3会做 或者显示 table cell 行为类似于 colspan 3 我在用display table row width 100 如何做呢 这是我的CSS
  • 无法将自定义标头从 WebAPI 公开给客户端

    我编写了一个程序来下载 web api 返回的 pdf word 或 txt 文件 并且工作正常 在服务器端我使用了 WebApi 和客户端 AngularJs 现在的问题是 我还需要来自 api 的文件名 为此我需要读取 api 返回的标
  • JSON 和 JSONP 有什么区别?

    格式明智 文件类型明智和实际用途明智 JSONP 是带填充的 JSON 也就是说 您在开头放置一个字符串 并在其周围放置一对括号 例如 JSON name stackoverflow id 5 JSONP func name stackov
  • AWS RDS 的 Mysqldump

    我想备份 RDS MYsql 数据库 我目前正在运行一个小实例 我需要程序来获取 sqldump 但我的问题是 RDS 在获取 sqldump 时是否会冻结 因为在其生产过程中会发生大量读 写操作 请帮忙 要回答确切的问题 获取 sqldu
  • 如何通过浏览器检测某个协议是否受支持?

    类似于 iTunes 的 链接制作器 http www apple com itunes linkmaker faq 通过网络浏览器 iTunes 网页能够查明是否itms 已在客户端工作站上注册 因此显示正确的消息 在 iTunes 中查
  • Worker 服务意外停止工作

    我有 NET Core 3 辅助服务 每 10 秒检查 一些内容 有一次 它 随机 停止这样做 我不确定为什么 到目前为止 它发生了两次 并且没有异常日志或类似的东西 所以我只能假设我应该添加一个try catch在 ExecuteAsyn