我有一个队列任务托管服务(.NET Core的新后台服务),我想测试一下。我的队列托管服务看起来像这样:
public QueuedHostedService(IServiceProvider serviceProvider, IBackgroundTaskQueue taskQueue, ILoggerFactory loggerFactory)
{
TaskQueue = taskQueue;
_logger = loggerFactory.CreateLogger<QueuedHostedService>();
_serviceProvider = serviceProvider;
}
protected async override Task ExecuteAsync(CancellationToken stoppingToken)
{
using (var scope = _serviceProvider.CreateScope())
{
while (false == stoppingToken.IsCancellationRequested)
{
var workItem = await TaskQueue.DequeueAsync(stoppingToken);
try
{
await workItem(scope.ServiceProvider, stoppingToken);
}
catch (Exception ex)
{
this._logger.LogError(ex, $"Error occurred executing {nameof(workItem)}.");
}
}
}
}
它只是从队列中读取任务,并按照它们到达的顺序执行它们。我已经验证了托管服务在生产环境中正在工作。我为此编写了一个测试,如下所示:
[TestMethod]
public async Task Verify_Hosted_Service_Executes_Task()
{
IServiceCollection services = new ServiceCollection();
services.AddSingleton<ILoggerFactory, NullLoggerFactory>();
services.AddHostedService<QueuedHostedService>();
services.AddSingleton<IBackgroundTaskQueue, BackgroundTaskQueue>();
var serviceProvider = services.BuildServiceProvider();
var backgroundQueue = serviceProvider.GetService<IBackgroundTaskQueue>();
var isExecuted = false;
backgroundQueue.QueueBackgroundWorkItem(async (sp, ct) => {
isExecuted = true;
});
await Task.Delay(10000);
Assert.IsTrue(isExecuted);
}
然而,我的回调函数从未执行。我该如何让我的任务在后台服务上执行?
编辑
我在模拟启动,并假设我的后台服务会正常工作,但显然我的服务从未启动。
在 .NET Core 中 Hosted Service 通常是如何启动的?
IHostedService
。您还需要配置服务依赖项。 - Filip