Выполнить 1 задачу с IHostedService - PullRequest
0 голосов
/ 21 января 2020

Что я делаю не так?

Классы IHostedService зарегистрированы в ASP. net core HostBuilder.

Затем работают в фоновом режиме, даже если у них нет работы.

Там невозможно передать их работу, поэтому я полагаю, что они должны забрать задачи из динамического хранилища c, например, базы данных

Так что, похоже, они опрашивают в основном. Или запустите короткие интервальные таймеры; в поисках работы

Тогда, когда они получают работу, они могут делать только 1 за один раз.

Так что, если мои пользователи (более 100) запускают отчеты в пятницу (или в любой другой день, когда они будут *) 1031 *) служба просто опрашивает базу данных в течение 6,5 дней, а затем регулируется в течение 0,5 дня, чтобы получить более 100 сгенерированных отчетов.

Так как я могу

  1. контролировать запуск служба IHostedservice
  2. Запуск более 1 экземпляра службы IHostedservice
  3. Отправка задач в виде данных в службу IHostedservice (экземпляр)

Furthur к этому Мне понадобится 10+ различных типов IHostedService. (10+ различных типов опроса)

Таким образом, запуск их в фоновом режиме только для опроса базы данных занимает циклы ЦП как на веб-сервере, так и на сервере базы данных

1 Ответ

1 голос
/ 21 января 2020

контролировать запуск службы IHostedservice

Вы не можете. Запуск и остановка IHostedService контролируются самим хостом. См. официальные документы

Запустите более 1 экземпляра службы IHostedservice

Поскольку IHostedService запускается самим хостом, я вам верю на самом деле не нужно запускать несколько IHostedService, но вместо этого вы ищете способ запустить задачи параллельно , а затем дождаться выполнения всех задач. IMO, лучший способ - создать делегата, который возвращает задачу, состоящую из нескольких подзадач. Эти подзадачи будут выполняться параллельно.

Отправка задач в виде данных в службу IHostedservice (экземпляр)

В официальных документах есть отличный пример для этого:

  • Вы можете обернуть свою задачу делегатом (который является формой данных).
  • Если вы хотите отправить эту задачу в IHostedService где-нибудь (например, в Controller), просто поместите вашу оболочку задачи (экземпляр делегата) в службу очереди.
  • HostedService будет ждать, пока в очереди появится задача, удалит рабочий элемент и выполнит этот экземпляр делегата.

Если вы хотите запустить несколько рабочих элементов одновременно, просто удалите несколько рабочих элементов из очереди и затем запустите эти задачи с помощью Task.WhenAll :

await Task.WhenAll(...);

Подробнее см. параллельное программирование

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...