我正在使用ASP.NET Core 2.1中新增的托管服务和后台任务功能进行一些测试,更具体地说是测试队列后台任务,并且关于并行性的问题浮现了出来。
目前我严格按照Microsoft提供的教程操作,在尝试模拟同一用户多次请求以排队任务的方式执行工作时,我发现所有的workItems都是按顺序执行,因此没有并行性。
我的问题是,这种行为是否符合预期?如果符合预期,为了使请求执行并行,是不是可以使用fire and forget而不是等待workItem完成?
我已经搜索了几天,没有找到关于这种情况的指南或示例,所以如果有人能够提供任何指导或示例,我将不胜感激。
编辑:由于来自教程的代码相当长,因此链接为https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.1#queued-background-tasks
执行工作项的方法如下:
public class QueuedHostedService : IHostedService
{
...
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Queued Hosted Service is starting.");
_backgroundTask = Task.Run(BackgroundProceessing);
return Task.CompletedTask;
}
private async Task BackgroundProceessing()
{
while (!_shutdown.IsCancellationRequested)
{
var workItem =
await TaskQueue.DequeueAsync(_shutdown.Token);
try
{
await workItem(_shutdown.Token);
}
catch (Exception ex)
{
_logger.LogError(ex,
$"Error occurred executing {nameof(workItem)}.");
}
}
}
...
}
这个问题的主要点是想知道是否有人能够分享如何使用这个特定技术同时执行多个工作项,因为服务器可以处理这个工作负载。
当我执行工作项时,我尝试了“fire and forget”方法,它按照我打算的方式工作了,多个任务同时并行执行,但我不确定这是否是一个好做法,或者是否有更好或更适当的处理这种情况的方法。
BackgroundProceessing
方法始终等待下一个任务。这意味着任务在并行(对于Web服务器)但按顺序处理。 - a-ctor