在.NET Core 3.0中,我们引入了一种称为“工作者服务”的新型应用程序模板。 该模板旨在为您提供一个在.NET Core中编写长期运行的服务的起点。 在本演练中,我们将创建一个工作程序并将其作为Windows服务运行。

创作工作者
注意事项 在我们的预发布版本中,工作程序模板与Web模板位于同一菜单上。 这将在将来的版本中更改。 我们打算将Worker Service模板直接放置在Create New Project Wizard中。
在Visual Studio中创建工作程序



在命令行上创建工作线程
运行dotnet new worker

作为Windows服务运行
要作为Windows服务启动,我们需要工作人员查看ServiceBase
.NET类型的启动和停止信号,该类型将Windows Service系统连接到.NET应用程序。 为此,您需要:
添加Microsoft.Extensions.Hosting.WindowsServices
NuGet程序包

在Program.cs UseServiceBaseLifetime
调用添加到HostBuilder
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceBaseLifetime() .ConfigureServices(services => { services.AddHostedService<Worker>(); }); }
这种方法可以做一些事情。 首先,它检查应用程序是否真的可以作为Windows服务工作,如果不是,则执行noop,这使得在本地运行或作为Windows服务时可以安全地调用此方法。
其次,它将主机配置为使用ServiceBaseLifetime
。 ServiceBaseLifetime
与ServiceBase
一起使用可帮助控制作为Windows服务启动的应用程序的生命周期。 这将覆盖处理诸如CTL + C之类的信号的标准ConsoleLifetime
。
安装工人
一旦让工作人员使用ServiceBaseLifetime
我们需要进行设置:
首先,让我们发布该应用程序。 我们将就地安装Windows服务,这意味着每次服务启动时可执行文件都会被阻止。 发布是确保启动该服务所需的所有文件都在一个位置并准备安装的一种好方法。
dotnet publish -oc:\code\workerpub
接下来,您可以在admin命令行中使用sc实用程序
sc create workertest binPath=c:\code\workerpub\WorkerTest.exe
例如:

安全说明:该命令作为本地系统启动服务,这不是您所需要的 。 相反,您应该创建一个服务帐户并以该帐户身份启动Windows服务。 我们不会在这里讨论这个问题,但是这里有一些ASP.NET文档: https : //docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/windows-service?view=aspnetcore- 2.2
记录中
日志记录系统具有事件日志服务,该服务可以将日志消息直接发送到Windows事件日志。 要输入事件日志,可以添加Microsoft.Extensions.Logging.EventLog
程序包,然后修改Program.cs
:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(loggerFactory => loggerFactory.AddEventLog()) .ConfigureServices(services => { services.AddHostedService<Worker>(); });
进一步的工作
在以下预览中,我们计划改进将Workers与Windows Services结合使用:
- 将UseWindowsServiceBaseLifetime重命名为UseWindowsService
- 在启动时将事件日志作为Windows服务添加自动和改进的集成。
结论
我们希望您可以尝试我们的新模板,并想知道它是如何工作的。 您可以在此处发送任何错误消息或建议: https : //github.com/aspnet/AspNetCore/issues/new/choose
