如何从控制器重新启动BackgroundService

2024-03-26

我创建了WcBackgroundService(由BackgroundService继承)并将其注入到OrdersController中。当前端 API 在重新启动端点上发送请求时,我将从我的工作线程执行 Restart 方法。

如上所述,当前的解决方案不会重新启动服务,只会创建后台服务的新实例并启动它。

下面是我的代码

Wc后台服务

public async Task Restart()
{
    await StopAsync(new CancellationToken());
    await StartAsync(new CancellationToken());
}

protected override async Task ExecuteAsync(CancellationToken cancellationToken)
{
     cancellationToken.Register(() =>
     {
         _logger.Debug($"Service {_serviceType} is stopping.");
     });

     while (!cancellationToken.IsCancellationRequested)
     {
         await DoWork();
     }
}

在启动中配置服务:

..
services.AddSingleton<IWcBackgroundService, WcBackgroundService>();
..

在启动中配置:

var wcBackgroundService = app.ApplicationServices.GetService<IWcBackgroundService>();
wcBackgroundService.StartAsync(new CancellationToken()).Wait();

您必须取消在开始时传递的同一个令牌,只有这样它才会取消后台任务。

你应该在你的任务中实现取消,通过你正确传递的令牌取消并存储在某个地方,例如实现一个任务管理服务,你在你的 DI 容器中注册为单例(你也可以从你的 wcBackGroundService 获取令牌,如果您通过属性公开它),然后实现一个控制器端点,比方说“RestartBackgroundTask”,它从单例服务获取令牌或 tokenSource 并取消它,然后再次调用 start 方法。您可以将 task.Start 移动到单独的函数中,这样您就可以使用所有相同的逻辑,而无需重复代码。

了解取消令牌源 https://learn.microsoft.com/en-us/dotnet/api/system.threading.cancellationtokensource?view=netframework-4.7.2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从控制器重新启动BackgroundService 的相关文章

随机推荐

  • 如何以编程方式访问数据网格行详细信息控件

    我有一个数据网格 其中包含一些定义的列 然后是行详细信息模板 如何在隐藏代码中访问行详细信息模板中的控件 我有一个按钮 我想以编程方式启用 禁用 但我不知道如何在后面的代码中访问它 我在MSDN上看到过这个 http msdn micros
  • Roo - 添加自定义查找器

    我使用 Roo 创建了一个使用现有数据库的项目 我能够创建动态查找器 但我想实现自定义查找器 它将接收 4 个参数并使用其中一些参数创建 Like 条件 其他参数创建 equals 条件 对 Roo 来说 最好的方法是什么 推荐的模式是编辑
  • 仅当验证成功时如何提交表单

    我尝试在提交请求之前验证表单 我正在使用 jquery 验证 我期望当页面完成加载时 表单将自动提交 并且我将在 div 中看到 正在加载 但什么也没发生 这是我的代码 但似乎不起作用
  • Android应用程序数据存储不断增加

    我正在开发一个 Android 应用程序 它基本上加载新闻文章列表 并在用户单击时在网络视图中打开它们 我想知道的是 当我在 设置 gt 应用程序 gt 管理应用程序 中查看应用程序详细信息时 总存储大小不断增加 特别是 数据存储规模不断增
  • jquery dataTable 过滤器/搜索不起作用

    我是 jquery 新手 我使用了 jqueryData 表 我在搜索过程中遇到问题 搜索适用于前两列 例如 如果我使用 QE5855 或 3453457 进行搜索 则工作正常 但它不搜索第三列 例如 如果我输入 美国 或 美国 表未排序
  • Flutter Firebase 错误(任务“:app:mergeExtDexDebug”执行失败)

    我是编程新手 对 flutter 和 firebase 也很陌生 我正在尝试这段代码 https github com tattwei46 flutter login demo https github com tattwei46 flut
  • Google Places API 为什么每次都会在不同的变量下返回纬度和经度?

    这让我抓狂 出于某种原因 API 用于返回纬度和经度 如下所示 我认为是这样的 place geometry location y作为纬度 place geometry location z作为经度 然后它开始像这样返回 place geo
  • 抛硬币问题的Python代码

    我一直在用 python 编写一个程序 模拟 100 次抛硬币并给出抛硬币的总数 问题是我还想打印正面和反面的总数 这是我的代码 import random tries 0 while tries lt 100 tries 1 coin r
  • 如何在 gradle 脚本中获取正在运行的 Android 风格名称

    这次我遇到了这个问题 我试图在 gradle 脚本中获取当前的风格 我已经尝试过这里给出的答案如何在 gradle 中获取当前的风味 https stackoverflow com questions 30621183 how to get
  • CSS a href 样式

    我有一个 hrefclass button 我正在尝试这样设计 button a link text decoration none button a visited text decoration none button a active
  • UITableViewAutomaticDimension 在 Xcode 6.3 中不起作用

    我将 Xcode 与 Swift 1 2 一起更新到 6 3 并完成了转换 除了表视图的动态行高之外 一切正常 我在 3 个完全不同的表视图上有这些 所以它可能不是影响该错误的其他因素 我将所有表视图设置为 tableView rowHei
  • asp.net mvc 中具有相同输入 id 的两个表单

    我在一个页面上有多个表单 它们通过隐藏输入将 id 传递给控制器 由于我对这些视图使用强类型视图 因此我认为我需要保持每个视图的 Id 相同 它目前有效 但我认为这是不好的做法 我应该如何处理这个问题 在 Django 中有表单前缀值 是否
  • React Native 对 fetch 的缓存行为是什么

    目前 React Native 的默认缓存行为是什么fetch打电话 官方 FB 指南只是说 看看 Mozilla 但我们使用的不是网络浏览器 我假设缓存行为是由于中间件而自定义的 假设我这样做 fetch https exampleser
  • 使用 postmessage 发回消息

    我目前正在制作一个应用程序 需要在两个域之间发送信息 将在页面加载时 网站1 创建 iFrame gt 向网站 2 发送 Postmessage window onload function iframe document createEl
  • 如果客户端在服务器之后启动,则 GStreamer v1.0 UDP 多播流无法正确解码

    我正在尝试使用 GStreamer 进行 UDP 多播屏幕流传输 我的投屏服务器应该在 Windows 上运行 and my 客户端应在 Linux 上运行 如果我在服务器之前启动客户端 一切都很好 问题是当我启动客户端并且服务器已经启动时
  • asp.net 成员资格表中 Lowered* 列的意义是什么?

    ASP Net 成员资格和朋友的 SQL 架构中列名称以 Lowered 为前缀的架构原因是什么 下面是相关列的一些示例 aspnet Applications LoweredApplicationName aspnet users Low
  • 如何针对触摸设备优化网站

    在 iPhone iPad Android 等触摸设备上 用手指敲击小按钮可能很困难 据我所知 没有跨浏览器的方法可以通过 CSS 媒体查询来检测触摸设备 所以我检查浏览器是否支持 Javascript 触摸事件 到目前为止 其他浏览器尚不
  • 不同jenkins管道插件之间的区别

    我正在努力通过詹金斯为我的一个项目设置回归 我是詹金斯的新手 对这么多可用的管道插件有点困惑 仅举几例 管道插件 https wiki jenkins io display JENKINS Pipeline Plugin 构建管道插件 ht
  • 仅当尝试打开假定的缓存文件时,Hadoop 2 IOException

    我最近更新到 hadoop 2 2 使用本教程here http codesfusion blogspot com 2013 10 setup hadoop 2x 220 on ubuntu html m 1 我的主要作业类如下所示 并抛出
  • 如何从控制器重新启动BackgroundService

    我创建了WcBackgroundService 由BackgroundService继承 并将其注入到OrdersController中 当前端 API 在重新启动端点上发送请求时 我将从我的工作线程执行 Restart 方法 如上所述 当