我在 C# 中使用 Windows 和 Visual Studio (2022) 编码,使用 .Net Core 创建 Windows 服务 该代码由 Visual Studio 生成并由其构建。 它确实创建了两个文件,一个名为 Program.cs 有此内容
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddHostedService< Worker>();
})
.Build();
await host.RunAsync();
和Worker.cs我已经修改为最少,但即使是原始的也无法启动
public class Worker : BackgroundService
{
static int i = 0;
private readonly ILogger<Worker> _logger;
private void writefile(string textf)
{
string path = $"C:\\Temp\\{textf}.txt";
using (StreamWriter sw = File.CreateText(path))
{
sw.WriteLine(textf);
}
}
public Worker(ILogger<Worker> logger)
{
writefile("Worker");
_logger = logger;
}
public override Task StartAsync(CancellationToken cancellationToken)
{
writefile("StartAsync");
return base.StartAsync(cancellationToken);
}
public override Task StopAsync(CancellationToken cancellationToken)
{
writefile("StopAsync");
return base.StopAsync(cancellationToken);
}
//ExecuteAsync is left empty
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
writefile($"ExecuteAsync{i++}");
return Task.CompletedTask;
}
}
上面的代码确实创建了预期的文件(我添加了此代码来跟踪问题)
当代码构建时,我使用命令提示符安装服务 sc create MyService binPath="c:\Visual Studio in\debug\myservice.exe"
.exe所在的目录有所有.dll,我也尝试过Release版本,但出现同样的错误。
事件查看器不显示任何其他信息,但显示相同的错误。
我也尝试使用自己的帐户作为该服务的启动帐户,结果相同
我还尝试将服务的超时(注册表)(\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServicePipeTimeout & \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\myservice\StartTimeout)更改为更大的值,但它们只是被忽略并且总是使用 30 秒。
有什么想法吗?谢谢
尝试删除程序中的await。
参见“重写程序类”部分:
https://learn.microsoft.com/en-us/dotnet/core/extensions/windows-service?pivots=dotnet-7-0