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开发跳槽
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现任务排序,可以使用ASP.NET Core MVC框架中的排序功能。在控制器中,可以定义一个Action来处理排序请求,该Action可以接收排序参数并对任务进行排序。 例如,假设你有一个Task类,其中包含一个Name和一个Priority属性。你可以定义一个Index Action来显示所有任务,并使用SortOrder参数来确定如何排序它们。 ```csharp public IActionResult Index(string sortOrder) { ViewData["NameSortParm"] = sortOrder == "name" ? "name_desc" : "name"; ViewData["PrioritySortParm"] = sortOrder == "priority" ? "priority_desc" : "priority"; var tasks = from t in _context.Tasks select t; switch (sortOrder) { case "name": tasks = tasks.OrderBy(t => t.Name); break; case "name_desc": tasks = tasks.OrderByDescending(t => t.Name); break; case "priority": tasks = tasks.OrderBy(t => t.Priority); break; case "priority_desc": tasks = tasks.OrderByDescending(t => t.Priority); break; default: tasks = tasks.OrderBy(t => t.Priority); break; } return View(tasks.ToList()); } ``` 在这个例子中,我们定义了两个视图数据项,用于在视图中显示排序链接。我们使用LINQ查询来获取所有任务,并根据SortOrder参数对它们进行排序。最后,我们将排序后的任务列表传递给视图进行显示。 在视图中,你可以使用Html.ActionLink来创建排序链接。例如,以下代码会创建一个名称排序链接: ```html <th> @Html.ActionLink("Name", "Index", new { sortOrder = ViewBag.NameSortParm }) </th> ``` 这样,当用户单击这个链接时,会发送一个带有名称排序参数的请求,控制器会接收该请求并按名称排序任务列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值