迷恋自留地 发表于 2021-9-22 17:52

.NET Core 基于 IHostedService 实现后台定时任务

# .NET Core 基于 IHostedService 实现后台定时任务


NET Core 2.0 引入了 IHostedService ,基于它可以很方便地执行后台任务,.NET Core 2.1 则锦上添花地提供了 IHostedService 的默认实现基类 BackgroundService ,在这篇随笔中分别用 Web 与 Console 程序体验一下。


### 第一步:首先继承 BackgroundService 实现一个 TimedBackgroundService

```csharp
class TimedBackgroundService : BackgroundService
    {
      private readonly ILogger _logger;
      private Timer _timer;

      public TimedBackgroundService(ILogger<TimedBackgroundService> logger)
      {
            _logger = logger;
      }

      protected override Task ExecuteAsync(CancellationToken stoppingToken)
      {
            _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
            return Task.CompletedTask;
      }

      private void DoWork(object state)
      {
            _logger.LogInformation($"Hello World! - {DateTime.Now}");
      }

      public override void Dispose()
      {
            base.Dispose();
            _timer?.Dispose();
      }

    }
```

### 第二步:在 ASP.NET Core Web 程序中执行这个后台定时任务只需在 Startup 的 ConfigureServices 注册 TimedBackgroundService 即可:

```csharp
public void ConfigureServices(IServiceCollection services)
{
    services.AddHostedService<TimedBackgroundService>();
}
```
## 简单Demo使用

创建`TaskAndOrderService` 类,继承 `: BackgroundService` ,实现接口

```csharp
/// <summary>
    /// 任务订单处理自动开始结束
    /// </summary>
    public class TaskAndOrderService : BackgroundService
    {

      protected override async Task ExecuteAsync(CancellationToken stoppingToken)
      {
         
            while (!stoppingToken.IsCancellationRequested)
            {
               //doto (处理业务)
               Console.WriteLine($"{DateTime.Now}-你好");
         
                await Task.Delay(5000, stoppingToken);
            }
      }

    }
```
然后在server中注册

```csharp
//设置任务自动开始后者任务结束
            services.AddHostedService<TaskAndOrderService>();
```

https://hunji.xyz/archives/87.html

jy04468108 发表于 2021-9-22 20:32

我还以为是framework,结果是asp。

goldli 发表于 2021-9-22 22:47

你直接创建一个worker service就是这玩意儿。

cssos15 发表于 2021-9-22 23:08

学习学习

迷恋自留地 发表于 2021-9-25 10:31

jy04468108 发表于 2021-9-22 20:32
我还以为是framework,结果是asp。

NET 5好吧

迷恋自留地 发表于 2021-9-25 10:32

goldli 发表于 2021-9-22 22:47
你直接创建一个worker service就是这玩意儿。

方法多种多样
页: [1]
查看完整版本: .NET Core 基于 IHostedService 实现后台定时任务