ASP.NET Core后台任务
之前在控制台程序中学习如何运行后台任务,ASP.NET Core中其实也有同样的方法BackgroundService
,本以为跟HostedService
没有区别,毕竟BackgroundService
是继承HostedService
的,但实际使用中才发现,依赖注入时,还是有区别的,下面就来说说具体踩到的坑
在服务实现类中,直接注入EF的话,运行时会报错,查了stackoverflow后知道,这里不能直接注入EFContext是因为生命周期问题,BackgroundService是asp.net core开始到结束,而EFContext注入的生命周期是Scoped,在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内),所以在启动时,会提示我们把EFContext改为单例注入
所以,代码需要修改成这样
public class DBHostedService : BackgroundService
{
private readonly ILogger _logger;
private readonly IServiceScopeFactory _scopeFactory;
public DBHostedService(ILogger<DBHostedService> logger, IServiceScopeFactory scopeFactory)
{
_logger = logger;
_scopeFactory = scopeFactory;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
using (var scope = _scopeFactory.CreateScope())
{
var _context = scope.ServiceProvider.GetRequiredService<EFContext>();
await _context.Database.EnsureDeletedAsync();
if (await _context.Database.EnsureCreatedAsync())
{
if (!_context.QuartInfo.Any())
{
var goodList = new List<QuartzInfo>()
{
new QuartzInfo(){
guid = Guid.NewGuid().ToString(),
triggerGroup = "TestGroup1",
triggerName = "TestName",
cronExpression = "0 0/1 * * * ? ",
fullClassName = "BackgroundServiceDemo.TestJob",
jobGroup = "jobGroup1",
jobName = "jobName1",
},
};
_context.QuartInfo.AddRange(goodList);
await _context.SaveChangesAsync();
}
}
}
}
}
参考资料:
ASP.NET Core 2.1 : 十一. 如何在后台运行一个任务
How should I inject a DbContext instance into an IHostedService
ASP.NET Core后台任务的更多相关文章
- ASP.NET Core开发-后台任务利器Hangfire使用
ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/任务计划程序. 可以使用于ASP.NET 应用也 ...
- ASP.NET Core 2.2 基础知识(九) 使用托管服务实现后台任务
在 ASP.NET Core 中,后台任务作为托管服务实现.托管服务是一个类,而且必须实现 IHostedService 接口,该接口定义了两个方法: StartAsync(CancellationT ...
- 在asp.net core中使用托管服务实现后台任务
在业务场景中经常需要后台服务不停的或定时处理一些任务,这些任务是不需要及时响应请求的. 在 asp.net中会使用windows服务来处理. 在 asp.net core中,可以使用托管服务来实现,托 ...
- ASP.NET Core 开启后台任务
本文告诉大家如何通过 Microsoft.Extensions.Hosting.BackgroundService 开启后台任务 实现 BackManagerService 类继承 Backgroun ...
- 在 ASP.NET Core 中执行租户服务
在 ASP.NET Core 中执行租户服务 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://gunna ...
- ASP.NET Core 运行原理解剖[2]:Hosting补充之配置介绍
在上一章中,我们介绍了 ASP.NET Core 的启动过程,主要是对 WebHost 源码的探索.而本文则是对上文的一个补充,更加偏向于实战,详细的介绍一下我们在实际开发中需要对 Hosting 做 ...
- 一张图理清ASP.NET Core启动流程
1. 引言 对于ASP.NET Core应用程序来说,我们要记住非常重要的一点是:其本质上是一个独立的控制台应用,它并不是必需在IIS内部托管且并不需要IIS来启动运行(而这正是ASP.NET Cor ...
- ASP.NET Core 2.0 支付宝当面付之扫码支付
前言 自从微软更换了CEO以后,微软的战略方向有了相当大的变化,不再是那么封闭,开源了许多东西,拥抱开源社区,.NET实现跨平台,收购xamarin并免费提供给开发者等等.我本人是很喜欢.net的,并 ...
- Hangfire在ASP.NET CORE中的简单实现
hangfire是执行后台任务的利器,具体请看官网介绍:https://www.hangfire.io/ 新建一个asp.net core mvc 项目 引入nuget包 Hangfire.AspNe ...
随机推荐
- IDEA 基本操作
1.IDEA 编译的JDK问题 点击出错的模块 将这个改成8,但是改了这个还是不行,项目一编译他有回去了. 正确的做法: 在跟pom.xml 中增加如下代码: <build> <pl ...
- numpy中argsort函数用法
在Python中使用help帮助 >>> import numpy >>> help(numpy.argsort) Help on function argsort ...
- 接口和抽象类有什么区别(Java基础)
接口可以多实现 Java中抽象类只能单继承 接口 相对于类来说 可以实现多个接口 抽象相对于 类来说 只能单一继承 一个类只能继承一个抽象类,但可以实现多个接口. 抽象类中可以包含抽象方法和 ...
- kuangbin专题16B(kmp模板)
题目链接: https://vjudge.net/contest/70325#problem/B 题意: 输出模式串在主串中出现的次数 思路: kmp模板 在 kmp 函数中匹配成功计数加一, 再令 ...
- export to pdf
first we need to download the link is : http://files.cnblogs.com/akingyao/itextsharp-all-5.4.2.zip t ...
- 微信Dat文件解码
最近在整理磁盘文件,因为经过一段时间的蹂躏后,磁盘实在是太多东西了,不整理一下,简直对不住我的SSD好嘛.偶然发现磁盘中某公司的文件夹占用空间简直不能再大,那可是我的C盘啊,合计才119GB的SSD空 ...
- 拓扑排序+数学+DP【洛谷P1685】 游览
P1685 游览 题目描述 顺利通过了黄药师的考验,下面就可以尽情游览桃花岛了! 你要从桃花岛的西头开始一直玩到东头,然后在东头的码头离开.可是当你游玩了一次后,发现桃花岛的景色实在是非常的美丽!!! ...
- luogu2948 滑雪课
题解里面全是dp的大神本蒟蒻瑟瑟发抖奉上一篇记忆化搜索... 其实嘛,记忆化搜索还是很安全透彻清真人品的,一般递推不好实现dp可以用记忆化搜索 然后本题先预处理一个mint[i]代表当前能力值为i,参 ...
- IIS反向代理
- Gym - 101845K 排序+概率
The UNAL programming coaches have lost a bet, they bet the 6 UNAL teams would occupy the first six p ...