我有一个带有Worker服务的ASP.NET应用程序,初始化方式如下.

builder.Services.AddHostedService<XXX>();

然后是服务人员本身.

public class XXX : BackgroundService
{
    readonly ILogger<XXX> _logger;

    public XXX(ILogger<XXX> logger)
    {
        _logger = logger;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Service Started.");
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Service Stopped.");
        return Task.CompletedTask;
    }

    protected async override Task ExecuteAsync(CancellationToken stoppingToken)
    {
       new MyInfiniteLoopClass();
    }
}

在ExecuteAsync方法中,我创建了类MyInfiniteLoopClass,它由无限循环组成,比方说while(true).

问题是,只有当我打破那个无限循环时,大摇大摆才会跑.这意味着整个ASP.NET应用程序都停在该方法上.我怎么才能并肩而行呢?

推荐答案

这是ASP.NETCore中的已知问题. 你可以在ExecuteAsync()的顶部加上await Task.Yield(),它会工作:

protected async override Task ExecuteAsync(CancellationToken stoppingToken)
{
   await Task.Yield();

   new MyInfiniteLoopClass();
}

更多信息:https://github.com/dotnet/runtime/issues/36063

Csharp相关问答推荐

Autofac:如何防止丢弃通过ServicCollection注册的服务?

在ASP.NET中为数据注释 Select 合适的语言

当Visual Studio处于升级管理模式时,无法安装Torch运行时

禁用AutoSuggestBox项目更改时的动画?

注册通用工厂的C# Dep注入

有没有一种方法可以防止在编译时在MicrosoftC或非单线程上下文中调用方法?

HttpContext. RequestAborted当Android APP失go 连接时未取消

如何修改中间件或其注册以正确使用作用域服务?

Nuget包Serilog.Sinks.AwsCloudwatch引发TypeLoadExceptions,因为父类型是密封的

使用泛型可空类实现接口

如何在NET 8最小API中自动记录TypedResults.Stream响应

如何在我的C#应用程序中设置带有reactjs前端的SignalR服务器?

为什么我的伺服电机不动,下面的代码?

从HTML元素获取 colored颜色

WPF如何获取有关从一个视图模型更改另一个视图模型的信息

ASP.NET核心8:app.UseStaticFiles()管道执行顺序

.NET EF Core Automapper项目到筛选不起作用

使用SQL Server 2022+时,我是否必须将代码从SqlConnection类对象中迁移出来?

C#-如何将int引用获取到byte[]

默认架构不存在EF核心迁移