在 asp.net core 中使用 worker services

介绍ASP.NET Core 3.0中的Worker Services特性,包括创建、配置和服务运行方式。通过示例展示如何自定义Worker类来实现复杂的后台任务处理。

ASP.NET Core 3.0 Preview 3 新增了一个 worker services,那什么是 worker services 呢?它如同 【windows服务】或者【Linux守护进程】一样的后台服务,在 Visual Studio 中提供了一个专门创建 worker services 的模板,如下图:
ws temp
值得注意的是要在 Visual Studio 中创建 worker services,你一定要装 ASP.Net Core 3.0 或者 .Net Core 3.0 版本。

Program 类

worker service 的默认实现包含了两个类:ProgramWorker 类, Program 类的功能差不多是合成了 传统的 Asp.Net Core 上的 Program + Startup 两个类的功能,还有一个专门用于写业务逻辑的 Worker 类,下面是 Program 类的实现,可以着重看一下 AddHostedService 是如何使用的。

public class Program
{
   public static void Main(string[] args)
   {
      CreateHostBuilder(args).Build().Run();
   }
   public static IHostBuilder CreateHostBuilder(string[] args) =>
      Host.CreateDefaultBuilder(args)
          .ConfigureServices((hostContext, services) => {
                    services.AddHostedService<Worker>();
          });
}

Worker 类

Work 类提供了对 依赖注入 的支持,它继承于 Microsost.Extensions.Hosting.Abstractions 命名空间下的 BackgroundService,这个抽象的 BackgroundService 类又实现了 IHostedService 接口,还可以看出这个抽象类定义了四个方法声明:StartAsync,StopAsync,ExecuteAsync,Dispose。

public abstract class BackgroundService : IHostedService, IDisposable
{
    public virtual void Dispose();
    public virtual Task StartAsync(CancellationToken cancellationToken);
    public virtual Task StopAsync(CancellationToken cancellationToken);
    protected abstract Task ExecuteAsync(CancellationToken stoppingToken);
}

Worker 类的构造函数接受 ILogger 类型的实例作为方法参数,下面的代码片段展示了这个 Work 类的默认实现。

public class Worker : BackgroundService
{
   private readonly ILogger<Worker> _logger;
   public Worker(ILogger<Worker> logger)
   {
      _logger = logger;
   }
   protected override async Task ExecuteAsync(CancellationToken stoppingToken)
   {
      while (!stoppingToken.IsCancellationRequested)
      {
          _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
          await Task.Delay(1000, stoppingToken);
      }
   }
}

要想把 worker service 跑起来,有两种途径,要么双击 exe 执行,要么做成 Windows服务 执行,如果真要做成 Windows 服务,你需要在 NuGet 上安装一下 Microsoft.Extensions.Hosting.WindowsServices 包即可,程序跑起来后的输出结果如下:
ws run

扩展 Workder Service

如果想让 worker service 实现更加复杂的功能,可以自己重写 BackgroundService 中的方法,比如说要执行一些非常耗时的任务,你可以重写下面的 ExecuteAsync 方法,下面的代码展示了如何自定义重写 StartAsync,ExecuteAsync 和 StopAsync。

public class Worker : BackgroundService
{
   private readonly ILogger<Worker> _logger;
   public Worker(ILogger<Worker> logger)
   {
      _logger = logger;
   }
   
   public override Task StartAsync(CancellationToken cancellationToken)
   {
       _logger.LogInformation("Worker service has been started at: {0}", DateTime.Now);
       return base.StartAsync(cancellationToken);
   }
   
   protected override Task ExecuteAsync(CancellationToken stoppingToken)
   {
      _logger.LogInformation("Worker service running at: {0}", DateTime.Now);
      return Task.CompletedTask;
   }
   
   public override Task StopAsync(CancellationToken cancellationToken)
   {
      _logger.LogInformation("Worker service has been stopped at: {0}", DateTime.Now);
      return base.StopAsync(cancellationToken);
   }
   
   public override void Dispose()
   {
       _logger.LogInformation("Worker service has been disposed at: {0}", DateTime.Now);
       base.Dispose();
   }
} 

Worker Service 日志功能

要想在 worker service 中记录日志,可以添加 Microsoft.Extensions.Logging 程序集,默认的 worker service 是 ConsoleLogger,也就是仅记录到 控制台 上,实际业务中不可能这么玩,如果想记录到其他地方该怎么做呢?比如 Windows Events 中,要这么做的话,可以使用 EventLog,在 nuget 上添加 Microsoft.Extensions.Logging.EventLog 包即可。

下面的代码片段展示了如何在 CreateHostBuilder 方法中进行配置将这个log记录到 event 中。

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logFactory => logFactory.AddEventLog())
        .ConfigureServices(services =>
        {
            services.AddHostedService<Worker>();
        }); 

译文地址:
《How to work with worker services in ASP.Net Core》
—>Learn how to use the new template available in ASP.Net Core 3.0 to build a worker service
转载原文:https://mp.weixin.qq.com/s/crdAOpBS2LQy2SFtvReqyQ

<think>好的,用户的问题是如何在C#的.Net Framework中实现Worker Service的示例教程。我需要先理解用户的需求。Worker Service通常指后台服务,长时间运行的任务,可能需要处理定时任务、消息队列等。用户可能希望有一个具体的代码示例,说明如何创建这样的服务。 首先,用户提到的引用内容中有关于BackgroundService类、Task的并行编程、以及配置服务的信息。例如,引用[1]中的InfoLogWorker继承自BackgroundService,并且在Program中配置服务。但要注意,BackgroundService.NET Core中的类,而用户问的是.Net Framework,可能需要调整。 因为在.Net Framework中,可能没有内置的BackgroundService类,所以需要手动实现类似的功能。可能需要使用Thread、Task或者传统的Windows服务。但用户希望的是Worker Service,可能类似于.NET Core中的实现方式,所以需要考虑在Framework中如何模拟。 接下来,我需要参考引用中的信息。引用[3]提到在.Net Framework 4中使用Task进行命令式任务并行,这可能对实现Worker有帮助。引用[5]中的并发集合可能用于任务间的数据共享。此外,引用[1]中的服务配置可能需要调整,因为Program的配置方式在Framework和Core有所不同。 可能的步骤是:创建一个继承自ServiceBase的Windows服务,使用Task来执行后台任务,处理启动和停止的逻辑。同时,需要安装服务,这可能需要使用InstallUtil或sc命令。 但用户可能希望的是控制台应用程序作为服务运行,这在Framework中可能需要第三方库如TopShelf来简化。或者,使用System.Threading.Timer来定期执行任务。 需要检查引用中的代码示例,引用[1]使用的是.NET Core的Host构建器,而用户需要的是Framework的实现。因此,不能直接使用AddHostedService,而需要用其他方式管理后台任务。 综合这些信息,我应该提供一个使用Windows服务项目模板的示例,展示如何创建服务,使用Task运行循环,并处理启动和停止。同时,可能需要说明如何安装服务。 此外,用户可能关心如何记录日志、处理配置,引用[4]提到在ASP.NET Core中访问配置,但在Framework中可能需要使用ConfigurationManager或其他方式。 最后,生成相关问题需要考虑用户可能遇到的后续问题,比如如何调试、如何处理异常、如何与并发集合配合使用等。</think>### C# .NET Framework 实现 Worker Service 分步教程 在 .NET Framework 中实现后台服务可通过`Windows Service`项目模板实现,以下为完整实现步骤: #### 1. 创建 Windows 服务项目 - 在 Visual Studio 中新建「Windows 服务」项目 - 重命名默认生成的`Service1.cs`为`WorkerService.cs` #### 2. 编写服务逻辑 ```csharp using System.ServiceProcess; using System.Threading; using System.Threading.Tasks; public class WorkerService : ServiceBase { private CancellationTokenSource _cts; protected override void OnStart(string[] args) { _cts = new CancellationTokenSource(); Task.Run(() => ExecuteAsync(_cts.Token)); } private async Task ExecuteAsync(CancellationToken token) { while (!token.IsCancellationRequested) { // 模拟后台任务执行 EventLog.WriteEntry("Worker执行中..."); await Task.Delay(5000, token); // 每5秒执行一次 } } protected override void OnStop() { _cts?.Cancel(); EventLog.WriteEntry("服务已停止"); } } ``` #### 3. 配置服务安装程序 在`WorkerService.cs`设计视图右键添加安装程序,自动生成`ProjectInstaller.cs`文件,其中包含: - `ServiceProcessInstaller`:设置运行账户 - `ServiceInstaller`:配置服务名称和启动类型 #### 4. 修改 Program.cs ```csharp static class Program { static void Main() { ServiceBase[] ServicesToRun = new ServiceBase[] { new WorkerService() }; ServiceBase.Run(ServicesToRun); } } ``` #### 5. 服务安装与卸载 ```powershell # 使用 InstallUtil 安装(需开发者命令提示符) InstallUtil.exe YourService.exe # 卸载服务 InstallUtil.exe /u YourService.exe # 或使用 sc 命令管理 sc create MyWorker binPath= "C:\path\to\YourService.exe" sc start MyWorker ``` #### 6. 调试技巧(控制台模式) 在`Program.cs`中添加调试入口: ```csharp #if DEBUG new WorkerService().ExecuteAsync(CancellationToken.None).Wait(); #else ServiceBase.Run(new ServiceBase[] { new WorkerService() }); #endif ``` ### 关键特性说明 1. **异步任务管理**:使用`CancellationToken`实现优雅停止[^3] 2. **日志记录**:通过`EventLog`写入系统事件查看器 3. **服务生命周期**:重写`OnStart`和`OnStop`方法控制服务状态 4. **安装部署**:通过安装程序配置服务属性[^4] §§ 1. 如何在 Worker Service 中实现定时任务调度? 2. 如何为 Windows 服务添加配置文件(App.config)支持? 3..NET Framework 中如何实现服务的自动更新? 4. Worker Service 与普通控制台程序在运行机制上有何本质区别? 5. 如何捕获并记录服务中的未处理异常?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值