下面是关于“使用.NET Core3.0创建一个Windows服务的方法”的完整攻略,包含两个示例说明。
简介
在Windows操作系统中,可以使用Windows服务来运行后台任务。在.NET Core 3.0中,可以使用Microsoft.Extensions.Hosting.WindowsServices NuGet包来创建Windows服务。本文将详细讲解如何使用.NET Core 3.0创建一个Windows服务。
步骤
以下是使用.NET Core 3.0创建一个Windows服务的步骤:
- 创建.NET Core 3.0控制台应用程序:
首先,需要创建一个.NET Core 3.0控制台应用程序。可以使用以下命令在命令行中创建一个.NET Core 3.0控制台应用程序:
dotnet new console -n MyService
- 添加Microsoft.Extensions.Hosting.WindowsServices NuGet包:
在.NET Core 3.0控制台应用程序中,可以使用Microsoft.Extensions.Hosting.WindowsServices NuGet包来创建Windows服务。可以使用以下命令在应用程序中安装Microsoft.Extensions.Hosting.WindowsServices NuGet包:
Install-Package Microsoft.Extensions.Hosting.WindowsServices
- 修改Program.cs文件:
在.NET Core 3.0控制台应用程序中,需要修改Program.cs文件以创建Windows服务。可以使用以下代码修改Program.cs文件:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace MyService
{
public class Program
{
public static void Main(string[] args)
{
var isService = !(Debugger.IsAttached || args.Contains("--console"));
var builder = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<MyService>();
})
.ConfigureLogging((hostContext, configLogging) =>
{
configLogging.AddConsole();
})
.UseWindowsService();
if (isService)
{
builder.RunAsService();
}
else
{
builder.RunConsoleAsync().Wait();
}
}
}
public class MyService : IHostedService
{
private readonly ILogger<MyService> _logger;
private Timer _timer;
public MyService(ILogger<MyService> logger)
{
_logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("MyService is starting.");
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}
private void DoWork(object state)
{
_logger.LogInformation("MyService is working.");
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("MyService is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
}
}
在上面的代码中,我们使用HostBuilder类创建一个主机,并使用AddHostedService方法将MyService类添加为托管服务。我们还使用UseWindowsService方法将应用程序配置为Windows服务。我们使用RunAsService方法将应用程序作为Windows服务运行。我们还定义了一个MyService类,该类实现了IHostedService接口,并在StartAsync方法中启动一个定时器,在DoWork方法中执行后台任务。
- 构建和安装Windows服务:
在.NET Core 3.0控制台应用程序中,可以使用以下命令构建和安装Windows服务:
dotnet publish -c Release -r win10-x64
sc create MyService binPath= "C:\path\to\MyService.exe"
在上面的代码中,我们使用dotnet publish命令将应用程序发布为Windows服务,并使用sc create命令创建Windows服务。
示例说明
以下是两个示例说明,演示如何使用.NET Core 3.0创建一个Windows服务:
示例1:在Windows服务中使用数据库
在.NET Core 3.0控制台应用程序中添加以下代码:
public class MyService : IHostedService
{
private readonly ILogger<MyService> _logger;
private readonly IDbConnection _dbConnection;
private Timer _timer;
public MyService(ILogger<MyService> logger, IDbConnection dbConnection)
{
_logger = logger;
_dbConnection = dbConnection;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("MyService is starting.");
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}
private void DoWork(object state)
{
_logger.LogInformation("MyService is working.");
using (var command = _dbConnection.CreateCommand())
{
command.CommandText = "SELECT COUNT(*) FROM MyTable";
var count = (int)command.ExecuteScalar();
_logger.LogInformation($"MyTable has {count} rows.");
}
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("MyService is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
}
在上面的代码中,我们在MyService类的构造函数中注入了IDbConnection接口,该接口用于访问数据库。我们在DoWork方法中使用IDbConnection接口执行SQL查询,并记录查询结果。
示例2:使用配置文件
在.NET Core 3.0控制台应用程序中添加以下代码:
public class MyService : IHostedService
{
private readonly ILogger<MyService> _logger;
private readonly IConfiguration _configuration;
private Timer _timer;
public MyService(ILogger<MyService> logger, IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("MyService is starting.");
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}
private void DoWork(object state)
{
_logger.LogInformation("MyService is working.");
var message = _configuration.GetValue<string>("Message");
_logger.LogInformation($"Message: {message}");
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("MyService is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
}
在上面的代码中,我们在MyService类的构造函数中注入了IConfiguration接口,该接口用于访问应用程序的配置文件。我们在DoWork方法中使用IConfiguration接口获取配置文件中的Message值,并记录该值。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用.NET Core3.0创建一个Windows服务的方法 - Python技术站