我在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);
        }
    }
}

我遗漏了什么?

推荐答案

To host your service in a Windows Service you need a call to UseWindowsService.
Setting the service name is optional.

documentation - Create Windows Service using BackgroundService人开始:

UseWindowsService扩展方法将应用程序配置为Windows服务.

你需要一个引用Microsoft.Extensions.Hosting.WindowsServices的NuGet包.

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.AddHostedService<Worker>();
    })
    .UseWindowsService(o => o.ServiceName = "Workerservice1")
    .Build();

Csharp相关问答推荐

如何从顶部提取发票号作为单词发票后的第一个匹配

将修剪声明放入LINQ中

EF Core. Income和. AsNoTracking正确用法

如何将Kafka消息时间戳转换为C#中的日期和时间格式?

Int和uint相乘得到LONG?

Blazor WebApp:原始异常:AADSTS700025:客户端是公共的,因此既不应显示客户端,也不应显示客户端

Azure函数中实体框架核心的依赖注入

在ASP.NET Core Web API项目中通过中间件修改`Request.Path`不会更改使用的控制器/操作

如何使用MailKit删除邮箱?

使用带有参数和曲面的注入失败(&Q;)

如何使用.NET6WPF打印车票?

如何更改新创建的实例的变量?

.Net MAUI,在将FlyoutPage添加到容器之前,必须设置添加构造函数导致Flyout和Detail"

使用动态键从请求体反序列化JSON

MSI无法将快捷方式添加到启动文件夹

岛屿和框架中的自定义控件库.Navigate-AccessViolationException

是否可以从IQueryable T中获取一个IdentyEntry T>

Foreach非常慢的C#

为什么连接到Google OAuth2后,结果.Credential为空?

缩写的MonthNames有问题