我正在使用 2.1 版中的 ASP.NET Core 托管服务功能对新的后台任务进行一些测试,更具体地说是队列后台任务,我想到了一个关于并行性的问题。
我目前严格遵循微软提供的教程,当尝试模拟一个工作负载时,同一用户发出多个请求以将任务排入队列,我注意到所有工作项都是按顺序执行的,因此没有并行性。
我的问题是,这种行为是预期的吗?如果是这样,为了使请求执行并行,是否可以触发并忘记,而不是等待 workItem 完成?
我已经搜索了几天关于这个特定场景的运气,所以如果有人提供任何指南或示例,我会非常高兴。
编辑:教程中的代码很长,所以它的链接是https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.1#queued -后台任务
执行工作项的方法是这样的:
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 方法,它按照我的预期工作,同时并行执行多个任务,我只是不确定这是否是一个好的做法,或者是否有更好或更正确的方式来处理这种情况。