Служба очередей — это отличный пример длительно выполняемой службы, где рабочие элементы могут помещаться в очередь и обрабатываться последовательно по мере завершения предыдущих рабочих элементов. Опираясь на шаблон рабочей службы, вы создаете новые функциональные возможности на основе BackgroundServiceшаблона рабочей службы.
Весь пример исходного кода "Рабочие роли в .NET" доступен для скачивания в Обозревателе примеров. Дополнительные сведения см. в разделе Обзор примеров кода: рабочие роли в .NET.
Чтобы создать новый проект службы рабочей роли с помощью Visual Studio, выберите Файл>Создать>Проект. В диалоговом окне Создание нового проекта выполните поиск по запросу "служба рабочей роли" и выберите шаблон "Служба рабочей роли". Если вы предпочитаете использовать .NET CLI, откройте используемый терминал в рабочем каталоге. Выполните команду dotnet new и замените <Project.Name> именем проекта.
Интерфейс командной строки.NET
dotnetnew worker --name<Project.Name>
Дополнительные сведения о команде .NET CLI для создания проекта службы рабочей роли см. здесь.
Совет
Если вы используете Visual Studio Code, вы можете выполнять команды .NET CLI из интегрированного терминала. Дополнительные сведения см. в статье Visual Studio Code: интегрированный терминал.
Функции System.Web пространства имен намеренно не переносились в .NET и остаются эксклюзивными для платформа .NET Framework. Дополнительные сведения см. в статье "Начало работы с добавочными ASP.NET для миграции ASP.NET Core".
В .NET для моделирования службы, вдохновленной функциональностью, начните с QueueBackgroundWorkItem добавления IBackgroundTaskQueue интерфейса в проект:
Существует два метода, один из которых предоставляет функциональные возможности очереди, а другой выводит из очереди рабочие элементы, которые были добавлены в нее ранее. Рабочий элемент — Func<CancellationToken, ValueTask>. Затем добавьте в проект реализацию по умолчанию.
Предыдущая реализация использует в качестве очереди Channel<T>. BoundedChannelOptions(Int32) вызывается с явным значением емкости. Емкость должна быть установлена на основе ожидаемой загрузки приложения и количества параллельных потоков, обращающихся к очереди. BoundedChannelFullMode.Wait вызывает вызовы возвращать ChannelWriter<T>.WriteAsync задачу, которая завершается только после того, как пространство становится доступным. Что приводит к обратному выражению, в случае, если слишком много издателей или вызовов начинают накапливаться.
Повторное создание класса рабочей роли
В следующем примере QueueHostedService:
Метод ProcessTaskQueueAsync возвращает значение Task в ExecuteAsync.
Фоновые задачи в очереди выводятся из очереди и выполняются в ProcessTaskQueueAsync:
Рабочие элементы ожидают остановки службы через StopAsync.
Замените существующий класс Worker следующим кодом C# и переименуйте файл в QueueHostedService.cs.
C#
namespaceApp.QueueService;
publicsealedclassQueuedHostedService(
IBackgroundTaskQueue taskQueue,
ILogger<QueuedHostedService> logger) : BackgroundService
{
protectedoverride Task ExecuteAsync(CancellationToken stoppingToken)
{
logger.LogInformation("""
{Name} is running.
Tap W to add a work item to the
background queue.
""",
nameof(QueuedHostedService));
return ProcessTaskQueueAsync(stoppingToken);
}
privateasync Task ProcessTaskQueueAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
Func<CancellationToken, ValueTask>? workItem =
await taskQueue.DequeueAsync(stoppingToken);
await workItem(stoppingToken);
}
catch (OperationCanceledException)
{
// Prevent throwing if stoppingToken was signaled
}
catch (Exception ex)
{
logger.LogError(ex, "Error occurred executing task work item.");
}
}
}
publicoverrideasync Task StopAsync(CancellationToken stoppingToken)
{
logger.LogInformation(
$"{nameof(QueuedHostedService)} is stopping.");
awaitbase.StopAsync(stoppingToken);
}
}
Служба MonitorLoop обрабатывает задачи постановки в очередь для размещенной службы при выборе на устройстве ввода ключа w:
В службу MonitorLoop внедряется IBackgroundTaskQueue.
IBackgroundTaskQueue.QueueBackgroundWorkItemAsync вызывается для постановки рабочего элемента в очередь:
Рабочий элемент имитирует долго выполняющуюся фоновую задачу:
Службы зарегистрированы в (Program.cs). Размещенная служба регистрируется с использованием метода расширения AddHostedService. MonitorLoop запускается в инструкции Program.cs верхнего уровня.
Чтобы запустить приложение из Visual Studio, нажмите клавишу F5 или выберите в меню Отладка>Начать отладку. Если вы используете .NET CLI, выполните команду dotnet run из рабочего каталога:
Интерфейс командной строки.NET
dotnetrun
Дополнительные сведения о выполнении команды .NET CLI см. в статье dotnet run.
При появлении запроса введите w (или W) по крайней мере один раз в очередь эмулированного рабочего элемента, как показано в примере выходных данных:
Output
info: App.QueueService.MonitorLoop[0]
MonitorAsync loop is starting.
info: App.QueueService.QueuedHostedService[0]
QueuedHostedService is running.
Tap W to add a work item to the background queue.
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: .\queue-service
winfo: App.QueueService.MonitorLoop[0]
Queued work item 8453f845-ea4a-4bcb-b26e-c76c0d89303e is starting.
info: App.QueueService.MonitorLoop[0]
Queued work item 8453f845-ea4a-4bcb-b26e-c76c0d89303e is running. 1/3
info: App.QueueService.MonitorLoop[0]
Queued work item 8453f845-ea4a-4bcb-b26e-c76c0d89303e is running. 2/3
info: App.QueueService.MonitorLoop[0]
Queued work item 8453f845-ea4a-4bcb-b26e-c76c0d89303e is running. 3/3
info: App.QueueService.MonitorLoop[0]
Queued Background Task 8453f845-ea4a-4bcb-b26e-c76c0d89303e is complete.
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
info: App.QueueService.QueuedHostedService[0]
QueuedHostedService is stopping.
Если приложение запускается из Visual Studio, выберите Отладка>Остановить отладку. Кроме того, можно нажать клавиши CTRL + C в окне консоли, чтобы сообщить об отмене.
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Отзыв о .NET
.NET — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Присоединитесь к серии встреч для создания масштабируемых решений искусственного интеллекта на основе реальных вариантов использования с другими разработчиками и экспертами.
В этом модуле вы узнаете о брокере сообщений RabbitMQ и о том, как использовать его для развязки микрослужб, обеспечивая надежное взаимодействие. Вы также увидите, как .NET Aspire упрощает интеграцию с RabbitMQ.