0

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

我的问题是它看起来不像我的 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;
}
4

1 回答 1

0

该代码创建了一个主机,但从不运行它。它只检索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();
}
于 2021-01-12T06:44:03.950 回答