BackgroundService QueueHostedService

如何解决BackgroundService QueueHostedService

我正在尝试使用 BackgroundService 和 IBackgroundTaskQueue 来让服务监视队列以完成工作。我从这里的 MS 文档中的示例开始:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-5.0&tabs=visual-studio#queued-background-tasks

我的问题是我的 QueueHostedService 似乎从未启动过。我的断点都没有被击中。现在,我使用相同的“MonitorLoop”概念来排队工作,即开始并正常工作以对记录进行排队,但它们永远不会出队,并且 QueueHostedService 中的任何内容都没有被命中(构造函数、ExecuteAsync、BackgroundProcessing)。

据我所知,我的示例代码与文档完全相同,但进行了以下修改: 监视器循环是异步的,但它启动良好,所以我认为这不是问题所在。 QueueHostedService 和 BackgroundTaskQueue 与它们的示例完全相同。 在我看来,添加的服务几乎相同:

 /// <summary>
 /// Create host and services
 /// </summary>
 /// <param name="args"></param>
 /// <returns></returns>
 public static IHostBuilder CreateHostBuilder(string[] args) =>
     Host.CreateDefaultBuilder(args)
         .ConfigureServices((hostContext,services) =>
         {
             services.Configure<sqlSettingsModel>(Configuration.GetSection(key: sqlSettingsModel.sqlSettingsKey));                                        
             services.AddSingleton<MonitorLoop>();
             services.AddHostedService<QueuedHostedService>();
             services.AddSingleton<IBackgroundTaskQueue,BackgroundTaskQueue>();
             services.AddSingleton<IsqlDataAccessService,sqlDataAccessService>();
             })
            .UseSerilog();
    }

这是我在 Program.cs 中的 Main 方法的样子:

/// <summary>
/// Start run loop
/// </summary>
/// <param name="args"></param>
public static async Task<int> Main(string[] args)
{
    Log.Logger = new LoggerConfiguration()               
       .Enrich.FromLogContext()               
       .Writeto.Async(a => a.Console(
           outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{NewLine}{Exception}"))
       .Writeto.Async(a => 
           a.File("WorkerService.log",rollingInterval: RollingInterval.Day,outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{NewLine}{Exception}"))
       .CreateLogger();
    try
    {
        Log.information("Starting Worker");
        var host = CreateHostBuilder(args).Build();                
        var monitorLoop = host.Services.GetrequiredService<MonitorLoop>();
        await monitorLoop.StartMonitorLoopAsync();
    }
    catch (Exception err)
    {
        Log.Fatal(err,"Host terminated unexpectedly");
    }
    finally
    {
        Log.CloseAndFlush();
    }
    return 1;
}

解决方法

代码创建了一个主机,但从不运行它。它只检索 MonitorLoop 服务并在其上运行一个方法。

public static void Main(string[] args)
{
    CreateHostBuilder(args).Build().Run();
}

文档示例通过调用 Run 来运行主机。不等待对 monitorLoop.StartMonitorLoop 的调用,否则将无法调用 Run

public static void Main(string[] args)
{
    var host =CreateHostBuilder(args).Build();
    
    var monitorLoop = host.Services.GetRequiredService<MonitorLoop>();
    monitorLoop.StartMonitorLoop();

    host.Run();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?