.NET Core基于Generic Host实现后台任务方法教程

网络推广 2025-04-25 06:34www.168986.cn网络推广竞价

介绍关于.NET Core基于Generic Host实现后台任务的相关资料,这是一个具有技术性的主题,对于开发者来说具有很高的学习和参考价值。随着.NET Core技术的不断发展和普及,后台任务的处理方式也在不断进步,Generic Host便是其中一种重要的解决方案。

一、前言

在软件开发中,后台任务扮演着非常重要的角色。它们默默地处理各种任务,支持前台应用程序的运行。在.NET Framework时代,后台任务通常通过Windows服务来实现。而在.NET Core时代,我们有更多的选择,其中Generic Host便是其中一种非常实用的方案。

二、什么是Generic Host

Generic Host是ASP.NET Core 2.1中的新功能,它的设计初衷是将HTTP管道从Web Host的API中分离出来,从而支持更多的Host方案。在.NET Core中,有两种主要的Host类型:一种是用于托管Web程序的Host,另一种就是Generic Host,适用于托管非Web应用,如后台任务。

Generic Host具有通用性,既可以在Web项目中使用,也可以在非Web项目中使用。这使得我们可以更灵活地运用Generic Host的特性,如配置、依赖注入和日志等。

三、后台任务示例

接下来,我们通过两个示例来展示如何使用Generic Host创建后台任务。

1. 一直运行的后台任务

这类任务类似于消息队列的消费者或RPC的服务端,需要不停地运行以处理请求。我们可以创建一个继承自BackgroundService的类来实现这个后台任务。

示例代码:

```csharp

public class MyLongRunningTask : BackgroundService

{

private readonly ILogger _logger;

public MyLongRunningTask(ILogger logger)

{

_logger = logger;

}

protected override async Task ExecuteAsync(CancellationToken stoppingToken)

{

while (!stoppingToken.IsCancellationRequested)

{

// 执行任务逻辑

_logger.LogInformation("Long running task is running.");

await Task.Delay(TimeSpan.FromSeconds(1)); // 每隔一秒执行一次

}

}

}

```

2. 定时运行的后台任务

这类任务需要按照设定的时间间隔或时间表来运行。我们可以使用IHostedService接口和Timer类来实现定时任务。在Generic Host中,我们可以直接注入IHostLifetime来停止主机,从而实现定时任务的优雅关闭。

示例代码:

```csharp

public class MyTimedBackgroundTask : IHostedService, IDisposable

{

private readonly ILogger _logger;

private readonly Timer _timer;

private readonly IHostLifetime _hostLifetime; // 用于优雅关闭主机

public MyTimedBackgroundTask(ILogger logger, IHostLifetime hostLifetime)

{

_logger = logger;

一直运行的后台任务

让我们深入一段关于后台任务的代码。这段代码定义了一个名为`PrinterHostedService2`的服务,它继承自`BackgroundService`。我们知道,一旦继承了`BackgroundService`,就必须实现其中的`ExecuteAsync`方法。除此之外,可以选择性地覆盖`StartAsync`和`SAsync`等方法。

在`PrinterHostedService2`中,我们看到了一个始终在跑的后台任务。该任务会不断输出日志信息,并且每次输出之间会有一个休眠期,这个休眠期是在配置文件中指定的秒数。它还使用了依赖注入,可以方便地注入数据仓储等信息。

接下来,我们再看另一个定时运行的后台任务示例,称为`TimerHostedService`。这个任务使用`Timer`来完成定时运行的功能。它在启动时创建一个定时器,然后按照设定的时间间隔执行工作。当定时器触发时,它会输出日志信息。它还包含了开始和停止任务的方法,并在任务结束时释放资源。

这两个后台任务都是通过控制台形式启动的。为了更方便地观察任务的运行情况,我们引入了NLog来记录任务的日志。

让我们进一步了解这两个后台任务的细节。首先是`PrinterHostedService2`的实现。在任务启动时,它会创建一个日志记录器并获取配置信息。然后,它会进入一个循环,每次循环都会输出日志信息并休眠一段时间。休眠的时间由配置文件中的设置决定。这样,即使在没有用户交互的情况下,该服务也能持续运行并输出日志信息。

对于`TimerHostedService`,它在启动时创建一个定时器并设置初始延迟和触发间隔。定时器触发时,会执行一些工作并输出日志信息。它还提供了停止任务并释放资源的方法。这样,我们可以根据需要随时启动或停止任务,并确保资源的合理使用。

在程序的入口处,我们有一个名为Program的类,它包含了一个特殊的Main函数,这个函数是程序的起点。不同于传统的Main函数,这是一个异步的任务(async Task Main)。让我们深入了解这个Main函数的代码。

我们创建了一个HostBuilder对象,它是ASP.NET Core的主机构建器,用于配置应用程序的各个方面。我们的程序将依赖于它来进行配置和启动。

在构建器的配置过程中,我们首先设置了日志系统。通过使用NLog,我们可以轻松地在应用程序中添加日志记录功能。我们加载了NLog的配置文件"nlog.config",以便自定义日志记录的行为。

接下来,我们配置主机。这里我们主要处理命令行参数,如果提供了命令行参数(args),我们将它们添加到主机的配置中。

然后,我们配置应用程序的设置。我们加载了"appsettings.json"文件以及针对特定环境的设置文件(如果存在的话)。我们还添加了环境变量和命令行参数的设置。这样,我们就可以从多个来源获取应用程序的配置信息。

在配置服务阶段,我们添加了一些必要的服务。这里我们使用了Options模式来配置应用程序设置,并注册了两个托管服务:PrinterHostedService2和TimerHostedService。这些服务将在程序启动时自动运行。

我们使用HostBuilder的RunConsoleAsync方法来启动控制台应用程序。这将启动我们的托管服务并等待用户输入来关闭程序。在这个过程中,我们的程序将按照我们在配置阶段设置的规则运行。这样,我们就完成了一个基本的ASP.NET Core应用程序的创建和配置过程。在这个过程中,我们充分利用了HostBuilder的灵活性和强大的配置能力,使得我们的程序能够轻松地适应不同的环境和需求。我们也通过添加日志和环境配置等功能,增强了程序的健壮性和可维护性。这就是我们的Main函数以及它的工作流程。

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by