У меня есть базовый веб-API ASP. NET, который использует фоновые задачи в очереди, как описано здесь .
Я использовал предоставленный образец кода и добавил IBackgroundTaskQueue
, BackgroundTaskQueue
и QueuedHostedService
точно так, как описано в статье.
В моем Startup.cs
я регистрирую только один экземпляр QueuedHostedService
следующим образом: services.AddHostedService<QueuedHostedService>();
Задачи, поступающие от контроллера WebApi, ставятся в очередь, а затем удаляются и выполняются одна за другой QueuedHostedService
.
Я хотел бы разрешить более одного потока фоновой обработки, который будет исключать из очереди и выполнять входящие задачи. Самое простое решение, которое я могу придумать, - это зарегистрировать более одного экземпляра QueuedHostedService
в моем Startup.cs
. например, что-то вроде этого:
int maxNumOfParallelOperations;
var isValid = int.TryParse(Configuration["App:MaxNumOfParallelOperations"], out maxNumOfParallelOperations);
maxNumOfParallelOperations = isValid && maxNumOfParallelOperations > 0 ? maxNumOfParallelOperations : 2;
for (int index = 0; index < maxNumOfParallelOperations; index++)
{
services.AddHostedService<QueuedHostedService>();
}
Я также заметил, что благодаря единственному семафору в BackgroundTaskQueue
экземпляры QueuedHostedService
на самом деле не работают все время, а только просыпаются при новом Задача доступна в очереди.
Это решение, кажется, отлично работает в моих тестах.
Но, в этом конкретном случае использования - действительно ли это действительное рекомендуемое решение для параллельной обработки?