2步轻松实现ASP.NET Core托管服务执行定时任务

Posted .NET100

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2步轻松实现ASP.NET Core托管服务执行定时任务相关的知识,希望对你有一定的参考价值。

最近接到一个新项目,需要在项目里添加一个后台任务,定时去发邮件通知客户;由于是一个比较小型的项目,不希望引入Quartz.Net、Hangfire等太重的框架,同时也没持久化要;寻觅了一下发现ASP.NET Core本身带有托管服务,可以执行定时任务。ASP.NET Core提供了IHostedService接口,它使我们能够创建后台任务并在应用程序的生命周期中管理这些任务。使用IHostedService接口,我们可以实现在指定时间间隔内重复执行的定时任务。本文将介绍如何使用IHostedService接口实现定时任务

使用步骤

1、实现IHostedService任务接口

首先,我们需要创建一个类来实现IHostedService接口。这个类将包含我们要执行的定时任务的逻辑。下面是一个简单的示例:

public class MyTaskService : IHostedService, IDisposable
    
        private readonly ILogger<MyTaskService> _logs;
        private Timer timer;
        public MyTaskService(ILogger<MyTaskService> logger)
        
            this._logs=logger;
        
        public Task StartAsync(CancellationToken cancellationToken)
        
            _logs.LogInformation("开始任务执行!!");
            timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
            return Task.CompletedTask;
        
        public void DoWork(object state)
        
            string dt = DateTime.Now.ToString();
            _logs.LogInformation("任务执行中:"+ dt.ToString()+ "!!");

        
        public Task StopAsync(CancellationToken cancellationToken)
        
            timer?.Change(Timeout.Infinite, 0);
            _logs.LogInformation("任务执行结束!");
            return Task.CompletedTask;
        
        public void Dispose()
        
            timer?.Dispose();
        
    
  //欢迎关注公众号:DOTNET开发跳槽,领取海量面试题。加微信号xbhpnet入群交流

简而言之,这是一个自定义服务,使用定时器每 30 秒执行一次任务。它实现了 IHostedService 和 IDisposable 接口,并使用依赖注入 ILogger 记录任务执行的开始和结束。

2、注册组件

使用定时任务需要将其注册到ASP.NET Core应用程序中,并根据需求。在Program.cs中,添加以下代码:

 builder.Services.AddHostedService<MyTaskService>();

3、执行效果

以上代码全部写完了,不需要引用任何包,很简单吧。执行效果如下:

结语

本文提供了一个简单的示例来演示如何使用IHostedService实现定时任务,并将其注册到ASP.NET Core应用程序中。大家可以根据自己使用场景来配置相应生命周期的时间间隔的定时任务。它的优点是轻量级别,使用简单;但是比较复杂的和批量的定时任务还是建议使用第三方定时任务组件,比如hangfire等主流工具。是不是很简单?希望本文对你有所收获。

来源公众号:DOTNET开发跳槽

使用 Core data/Restkit 删除托管对象

【中文标题】使用 Core data/Restkit 删除托管对象【英文标题】:Delete Managed Object using Core data/Restkit 【发布时间】:2013-08-06 11:10:18 【问题描述】:

我必须删除服务器不再返回的本地存储数据(孤立对象)。我在初始化对象管理器时使用以下代码。

[objectManager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) 
            RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"/relative_path"];

            NSDictionary *argsDict = nil;
            BOOL match = [pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:&argsDict];
            if (match) 
                NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Articles"];
                return fetchRequest;
            

            return nil;
        ];

在上面的代码中,'match' 条件返回 TRUE。但 Fetch Request 不会删除服务器未返回的孤立对象。

【问题讨论】:

【参考方案1】:

您想使用记录在 here 中的“获取请求块和删除孤立对象”方法。

【讨论】:

感谢您的回复。我已在 My AppDelegate 中添加了该功能。但是当 url 匹配时,它会从服务器返回所有对象,包括已删除的对象。有什么我需要做的吗?我已经更新了我的 qn.pls 外观。 它应该返回所有项目。 RestKit 会将获取结果与服务器结果进行比较,并删除服务器未返回的项目。 但是当我检查我的数据库时。旧数据仍然存在于表中。 保存MOC时是否触发表更新?并且您检查(调试)了获取请求是否已创建并返回? 不,我没有触发表更新。此外,当我调试 fetch 请求时,它返回 (entity: Articles; predicate: ((null)); sortDescriptors: ((null)); type: NSManagedObjectResultType; )

以上是关于2步轻松实现ASP.NET Core托管服务执行定时任务的主要内容,如果未能解决你的问题,请参考以下文章

先定一个小目标Asp.net Core 在IIS上的托管运行

七步学会ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

ASP.NET Core 进程内(InProcess)托管

如何在 ASP.Net Core 中使用 IHostedService

Ktor 中的后台任务,例如 ASP.Net Core 中的“托管服务”

ASP.NET Core 托管捆绑包 5 是不是也可以运行 .NET/ASP.NET Core 2.1 应用程序?