后台服务队列托管服务
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 似乎从未启动过。 None 我的断点因此被击中。现在我使用相同的“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();
}
我正在尝试使用 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 似乎从未启动过。 None 我的断点因此被击中。现在我使用相同的“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();
}