c# - 如何使 ExecuteAsync 异步运行

标签 c# .net background-service

我有 asp.net 应用程序,其辅助服务已像这样初始化。

builder.Services.AddHostedService<XXX>();

然后是 Service Worker 本身。

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) .

问题是只有当我打破无限循环时,swagger 才会运行。这意味着整个 ASP.NET 应用程序将停止在该方法上。我怎样才能并排制作?

最佳答案

这是 ASP.NET Core 中的一个已知问题。 您可以将 await Task.Yield() 添加到 ExecuteAsync() 的顶部,它将起作用:

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

   new MyInfiniteLoopClass();
}

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

关于c# - 如何使 ExecuteAsync 异步运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77506238/

相关文章:

c# - 微软依赖注入(inject)文档

c# - 如何使用带有 RESTSharp 的 HTTP LINK 动词请求 API?

c# - 将 .Net Membership Provider 与 Entity Framework 4.3 迁移结合使用

c# - 如何将 IExcelDataReader 值转换为字符串数据类型

c# - C# 中的邮件存储配额检查器

android - 如何将数据从 Android 后台服务传递到 Activity

c# - 将字符串数组排序为 Int

c# - Entities Framework 6 alpha 2 - 异步模式

android - 获取正在运行的服务的对象

android - Android R 中的后台服务在省电模式下停止