C#的IHostedService是什么?如何创建在后台运行的服务?

使用 IHostedService 创建后台服务需实现接口或继承 BackgroundService 类,1. 实现 StartAsync 和 StopAsync 方法启动和停止任务,2. 在 Program.cs 中通过 AddHostedService 注册服务,推荐继承 BackgroundService 并重写 ExecuteAsync 执行循环逻辑,同时监听 CancellationToken 确保优雅关闭。

c#的ihostedservice是什么?如何创建在后台运行的服务?

IHostedService 是 C# 中用于在 .NET 应用程序(特别是 ASP.NET Core 和泛型主机应用)中运行后台任务的接口。它允许你在应用程序启动后执行长时间运行或周期性执行的操作,比如定时处理数据、轮询数据库、发送邮件、监听消息队列等。

实现 IHostedService 接口后,你的服务会在应用启动时自动开始,并在应用关闭时优雅地停止。

如何使用 IHostedService 创建后台服务?

要创建一个后台运行的服务,你需要:

1. 实现 IHostedService 接口

该接口包含两个方法:

StartAsync(CancellationToken cancellationToken):在应用启动后调用,用于启动后台任务。StopAsync(CancellationToken cancellationToken):在应用关闭时调用,用于优雅地停止任务。

下面是一个简单的后台服务示例,每 5 秒打印一次时间:

using Microsoft.Extensions.Hosting;using System.Threading;using System.Threading.Tasks;public class MyBackgroundService : IHostedService{    private Timer? _timer;    public Task StartAsync(CancellationToken cancellationToken)    {        _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));        return Task.CompletedTask;    }    private void DoWork(object? state)    {        // 避免在取消令牌已触发时继续执行        Console.WriteLine($"后台任务执行时间: {DateTime.Now}");    }    public Task StopAsync(CancellationToken cancellationToken)    {        _timer?.Change(Timeout.Infinite, 0);        return Task.CompletedTask;    }}

2. 将服务注册到依赖注入容器

Program.csStartup.cs 中将你的服务添加为托管服务:

var builder = WebApplication.CreateBuilder(args);// 添加后台服务builder.Services.AddHostedService();var app = builder.Build();app.Run();

更推荐的方式:继承 BackgroundService 类

.NET 提供了一个抽象类 BackgroundService,它是 IHostedService 的实现,更适合复杂的异步后台任务。

它提供了一个虚方法 ExecuteAsync,你可以重写它来定义主逻辑。

using Microsoft.Extensions.Hosting;using System.Threading;using System.Threading.Tasks;public class TimedBackgroundService : BackgroundService{    protected override async Task ExecuteAsync(CancellationToken stoppingToken)    {        while (!stoppingToken.IsCancellationRequested)        {            // 执行任务            Console.WriteLine($"定时任务执行: {DateTime.Now}");            // 等待 5 秒,期间可被取消            await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken);        }    }}

同样需要注册:

“`csharpbuilder.Services.AddHostedService();“`

常见用途和注意事项

适合运行轻量级、长期存在的任务,如监控、定时同步、消息消费等。避免在 StartAsync 中阻塞主线程,应使用 TimerTask.Run 启动异步操作。务必监听 CancellationToken,确保应用关闭时能及时停止任务。多个 IHostedService 按注册顺序启动,反向停止。若任务失败且未捕获异常,可能导致应用崩溃,建议内部做好异常处理。

基本上就这些。通过 IHostedServiceBackgroundService,你可以轻松在 .NET 应用中集成后台任务,无需额外线程管理,且与应用生命周期一致。

以上就是C#的IHostedService是什么?如何创建在后台运行的服务?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1442048.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C#如何实现定时任务?Hangfire与Quartz.NET两大任务调度框架对比
上一篇 2025年12月17日 18:41:03
C#的接口(Interface)是什么?如何实现和使用接口?
下一篇 2025年12月17日 18:41:17

相关推荐

  • iPhone 13 mini如何录制屏幕声音

    首先在控制中心添加屏幕录制按钮,长按开启麦克风后开始录制,结束录屏后视频自动保存至相册可随时查看分享。 在 iPhone 13 mini 上录制屏幕声音非常简单,系统自带的功能就能满足需求。只要正确设置并开启麦克风,就能同时录下屏幕画面和声音。 添加录屏功能到控制中心 首先需要把录屏快捷方式加到控制…

    2026年9月13日
    000
  • 《巫师3》十周年!《巫师交响音乐会》登陆上海

    CD PROJEKT RED 今日正式揭晓,《巫师3:狂猎》十周年特别企划——《巫师交响音乐会》全球巡演即将开启亚洲篇章。本次巡演将陆续登陆上海、首尔、马尼拉等多个亚洲重要城市,更多演出地点也将逐步公布。其中,上海站将采用百人规模的大型交响乐团阵容,带来震撼人心的视听盛宴,令人翘首以待! 这场专为纪…

    2026年9月13日
    000
  • AI推文助手如何制作行业趋势分析 AI推文助手的趋势预测功能

    AI推文助手如何制作行业趋势分析 AI推文助手的趋势预测功能AI推文助手如何制作行业趋势分析 AI推文助手的趋势预测功能AI推文助手如何制作行业趋势分析 AI推文助手的趋势预测功能AI推文助手如何制作行业趋势分析 AI推文助手的趋势预测功能

    优化AI推文助手趋势预测需四步:一、扩展社交媒体与行业数据库来源并定时更新;二、调优NLP模型参数,提升情感分析与主题建模精度;三、引入ARIMA或Prophet算法构建时间序列预测未来热度;四、建立用户反馈闭环,持续迭代模型。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 …

    2026年9月13日 用户投稿
    000
  • 如何在Laravel中使用批量赋值

    laravel中的批量赋值通过数组直接填充模型属性,提升开发效率。主要方式有:1. fill()方法,先创建实例再填充数据;2. create()方法,直接创建并填充。为防止安全风险,需在模型中使用$fillable或$guarded明确允许的字段。处理关联关系时,需定义关联并在相关模型设置$fil…

    2026年9月13日
    200
  • 网易云音乐网页版登录网址 网易云音乐在线听歌

    网易云音乐网页版登录网址是https://music.163.com/,用户可通过顶部导航栏进入推荐、歌单等页面,点击右上角“登录”按钮使用手机号或社交账号登录,登录后可同步收藏歌曲、播放记录,搜索框支持精准查找音乐,播放界面提供动态歌词与字体调节功能。 网易云音乐网页版登录网址在哪里?这是不少网友…

    2026年9月13日
    100
  • 如何利用VSCode的配置文件(Launch.json)环境变量来管理不同环境的配置?

    通过配置launch.json中的多个调试环境并结合.env文件,可高效管理开发、测试、生产等不同环境的运行参数。 在使用 VSCode 进行开发时,launch.json 文件是调试配置的核心。通过合理利用环境变量和配置文件分离,可以轻松管理不同环境(如开发、测试、生产)的运行参数。 理解 lau…

    2026年9月13日
    000
  • 如何在Laravel中使用条件子句

    在laravel中构建动态查询的核心方法是使用查询构建器和eloquent orm的when方法。1. when接受条件表达式及两个可选闭包,分别在条件为真或假时执行;2. 它避免冗长的if-else结构,提升代码可读性和维护性;3. 通过链式调用保持查询逻辑清晰,仅在条件满足时添加子句;4. 支持…

    2026年9月13日
    000
  • 如何找到好的拼多多客服外包公司?有哪些推荐?拼多多商家必看!3招教你避开外包陷阱,找到靠谱客服团队

    在拼多多日均百万流量的激烈竞争中,超过一半的中小商家因客服团队运营成本过高而面临生存挑战。传统bpo模式通常需要配置20人以上的客服团队,而如今创新的aibpo解决方案仅需5人便可实现7×24小时高效响应。本文将深入剖析电商客服外包的关键评估维度,并推荐经过实战检验的高性价比服务商。 一、拼多多商家…

    2026年9月13日
    000
  • mysql如何优化磁盘IO

    使用SSD、合理RAID配置及分离日志文件可提升硬件层性能;增大innodb_buffer_pool_size并启用预加载以优化缓存;调整日志刷盘策略平衡安全与性能;通过合适字段类型、索引设计和查询优化减少IO开销。 MySQL 的磁盘 IO 性能直接影响查询响应速度和系统吞吐量,尤其在数据量大、写…

    2026年9月13日
    000
  • AI推文助手如何制作产品评测 AI推文助手的评测类内容写作指南

    AI推文助手如何制作产品评测 AI推文助手的评测类内容写作指南AI推文助手如何制作产品评测 AI推文助手的评测类内容写作指南AI推文助手如何制作产品评测 AI推文助手的评测类内容写作指南AI推文助手如何制作产品评测 AI推文助手的评测类内容写作指南

    明确评测目标与受众定位,构建结构化框架,优化语言表达,融合数据与主观体验,生成多版本内容以适配不同平台发布需求。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 如果您希望借助AI推文助手撰写产品评测类内容,但不确定如何组织语言或突出核心卖点…

    2026年9月13日 用户投稿
    100
  • iPhone 11 Pro Max如何手动更新系统

    通过“设置”>“通用”>“软件更新”可无线更新,确保Wi-Fi和电量充足;2. 或用电脑通过iTunes/Finder连接更新;3. 更新前需备份数据、清理存储并确认Apple ID密码。 iPhone 11 Pro Max 手动更新系统很简单,不需要借助第三方工具。最推荐的方式是通过手…

    2026年9月13日
    000
  • mysql如何优化日志轮转

    合理配置日志策略、控制文件大小、减少I/O影响,并通过logrotate实现自动化轮转,平衡可维护性与性能。 MySQL日志轮转的优化核心在于合理配置日志策略、控制文件大小、减少I/O影响,并结合系统工具实现自动化管理。重点是平衡可维护性与性能开销。 合理设置日志类型与级别 不必要的日志会增加写入负…

    2026年9月13日
    100
  • vivo浏览器耗电量大怎么解决_vivo浏览器降低功耗与后台占用的方法

    首先调整vivo浏览器设置关闭文本渲染和开启省流模式,其次限制后台活动与自启动权限,再关闭首页信息流推荐,最后优化系统显示与网络配置以降低整体功耗。 如果您在使用vivo浏览器时发现手机电量消耗明显加快,可能是由于浏览器的后台活动、页面渲染或网络加载功能持续运行所致。以下是解决此问题的具体方法。 本…

    2026年9月13日
    100
  • deepseek安卓版下载地址_安卓手机下载deepseek安卓版官网

    DeepSeek安卓版官网下载地址是https://www.deepseek.com/,该应用提供AI对话、文档解析、创意写作、多领域知识解答和图像识别等功能,支持跨平台数据同步,界面简洁、运行流畅,并具备编程辅助、商品查询、内容创作及学习资料整理等实用特性。 ☞☞☞AI 智能聊天, 问答助手, A…

    2026年9月13日
    000
  • Linux系统目录proc虚拟目录功能

    Linux系统目录proc虚拟目录功能Linux系统目录proc虚拟目录功能Linux系统目录proc虚拟目录功能Linux系统目录proc虚拟目录功能

    /proc目录是Linux中由内核动态生成的虚拟文件系统,提供运行时系统与进程信息。1. 其下以PID命名的子目录存储各进程的cmdline、status、fd、exe和maps等信息,便于调试与资源分析。2. 包含cpuinfo、meminfo、version、loadavg、uptime、par…

    2026年9月13日 用户投稿
    100
  • MySQL GROUP_CONCAT函数实现订单项按日期合并显示

    本教程详细阐述了如何利用MySQL的GROUP_CONCAT函数,将同一日期下的多个订单项合并为一行显示,并以逗号分隔。文章将涵盖从数据库查询优化到PHP数据处理的完整流程,旨在帮助开发者高效地在购物网站等场景中展示分组后的订单信息,提升数据可读性。 在构建在线购物平台时,展示客户订单详情是一个常见…

    2026年9月13日
    000
  • 荣耀90 GT散热结构解析 荣耀90 GT性能模式开启

    荣耀90 GT通过3D冰封冷驱散热系统和智能性能调度实现高效散热与性能平衡。其核心为5000mm² 3D仿生VC均热板,导热效率提升30%;搭配航天级石墨烯贴片覆盖多发热源,双毛细泵加速液体回流,AI温控算法根据场景智能调节温度。实测《崩坏:星穹铁道》1小时机身最高46.2℃,握持区不烫手。性能模式…

    2026年9月13日
    1500
  • 如何用ChatGPT来重构优化一段旧代码_提升代码质量与性能的步骤

    明确目标并提供上下文,分步引导ChatGPT优化代码结构、算法和语言特性,最后验证建议并本地测试,确保重构有效且安全。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 用ChatGPT来重构和优化旧代码是一种高效提升代码质量与性能的方式。关键…

    2026年9月12日
    000
  • 在Java中如何实现线程间安全通信

    答案:Java中线程安全通信需保证可见性、原子性和有序性,常用synchronized实现同步与wait/notify协作,ReentrantLock结合Condition提供更灵活控制,BlockingQueue适用于生产者-消费者模型,volatile确保变量可见性,原子类如AtomicInte…

    2026年9月12日
    000
  • 12306会员积分兑换车票有手续费吗_12306会员积分兑换手续费详解

    积分兑换车票不收手续费,改签时扣除1000积分作为手续费,且票价差额不退;因铁路责任导致行程变更时,所扣积分及手续费均返还。 如果您在使用12306会员积分兑换车票时,发现改签操作涉及积分扣除,可能对是否存在手续费存在疑问。以下是关于积分兑换及改签过程中相关费用的详细说明。 本文运行环境:华为Mat…

    2026年9月12日
    000

发表回复

登录后才能评论
关注微信