我在VS2022中使用Worker服务模板创建了一个新的Windows服务"WorkerService",平台是.NET6.
该程序本身是有效的,它会显示一个日志(log)"Worker Running..."每一秒.
我将它发布到C:\WorkerService并通过PowerShell命令注册它:
New-Service -Name "WorkerService1" -BinaryPathName "C:\WorkerService\WorkerService1.exe"
通过服务控制台启动新服务在30秒后失败,并显示错误1053和消息"服务未及时响应启动或控制请求".事件日志(log)仅显示两个错误条目,均声明服务未及时响应
不过,直接通过PowerShell运行这项服务并不成问题.
为了跟踪该问题,我使用一种方法来记录所采取的不同步骤,从而丰富了启动代码:
using WorkerService1;
internal class Program
{
private static StreamWriter? StreamWriter { get; set; }
private static void Log(string message)
{
StreamWriter.WriteLine($"{DateTime.Now}: {message}");
StreamWriter.Flush();
}
private static async Task Main(string[] args)
{
using (StreamWriter = new StreamWriter("serviceLog.txt"))
{
Log("Starting up...");
try
{
Log("Building...");
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
}).Build();
Log("Running...");
await host.RunAsync();
}
catch (Exception e)
{
Log(e.ToString());
throw;
}
Log("Shutting down...");
}
}
}
当交互执行时,这将在文本文件中写下预期的行数,但当再次try 通过服务控制台启动该服务时,则不起任何作用.在这种情况下,代码似乎无法到达.
Worker类是模板的未修改版本:
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);
}
}
}
我遗漏了什么?