NetCore中怎么利用托管服务执行后台任务,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
首先我们创建一个控制台项目,下载基础包
nuget install Microsoft.Extensions.Hosting
初始化Program.cs文件
public static class Program
{
static async void Main(string[] args)
{
var builder = new HostBuilder().ConfigureServices((context, service) =>
{
});
await builder.RunConsoleAsync();
}
}注入后台服务非常简单,调用service.AddHostedService方法将自定义的服务进行注入。
service.AddHostedService<CustomerJob/Service>();
自定义的后台服务类需要满足定义的接口,才可以被正常使用,下面我引用一个官方的案例进行说明
定时后台任务使用 [System.Threading.Timer]类。 计时器触发任务的
DoWork方法。 在StopAsync上禁用计时器,并在Dispose上处置服务容器时处置计时器:
继承IHostedService接口,实现StartAsync和StopAsync方法即可将服务正常注入后台任务中。
IDisposable的作用主要是在进程关闭时释放定时器资源
public class TimedHostedService : IHostedService, IDisposable
{
private int executionCount = 0;
private readonly ILogger<TimedHostedService> _logger;
private Timer _timer;
public TimedHostedService(ILogger<TimedHostedService> logger)
{
_logger = logger;
}
public Task StartAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Timed Hosted Service running.");
_timer = new Timer(DoWork, null, TimeSpan.Zero,
TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}
private void DoWork(object state)
{
var count = Interlocked.Increment(ref executionCount);
_logger.LogInformation(
"Timed Hosted Service is working. Count: {Count}", count);
}
public Task StopAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Timed Hosted Service is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}将上文中的内容进行一个整合,得到的效果是
public static class Program
{
static async void Main(string[] args)
{
var builder = new HostBuilder().ConfigureServices((context, service) =>
{
service.AddHostedService<TimedHostedService>();
});
await builder.RunConsoleAsync();
}
}Ctrl+F5即可查看执行效果
以上说明的是后台任务在Core控制台中的应用,那么在AspNetCore【Web项目】中是怎么使用的呢。当然都是一样的,只是注入的地方发生了小小的改变,在AspNetCore中注入通常发生在StartUp.cs中的方法ConfigureServices。使用方法和控制台一致。
public void ConfigureServices(IServiceCollection services)
{
service.AddHostedService<TimedHostedService>();
}每一次web请求对应一个数据库上下文[DbContext],这个时候就要用要带作用域的服务。
带作用域的服务使用也非常简单,可以参考官方文档,这里我就不做其他介绍
免责声明:本站发布的内容(图片、视频和文字)以原创、来自本网站内容采集于网络互联网转载等其它媒体和分享为主,内容观点不代表本网站立场,如侵犯了原作者的版权,请告知一经查实,将立刻删除涉嫌侵权内容,联系我们QQ:712375056,同时欢迎投稿传递力量。
Copyright © 2009-2022 56dr.com. All Rights Reserved. 特网科技 特网云 版权所有 特网科技 粤ICP备16109289号
域名注册服务机构:阿里云计算有限公司(万网) 域名服务机构:烟台帝思普网络科技有限公司(DNSPod) CDN服务:阿里云计算有限公司 百度云 中国互联网举报中心 增值电信业务经营许可证B2
建议您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流浏览器浏览本网站


