C#: шаблон проектирования для фоновой работы / общения без злоупотребления Task.Run - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть c#. net (4.7.2) веб-приложение rest api, которое должно периодически обмениваться (http) с группой из 100 устройств. В настоящее время у нас в основном есть обработчик событий, который изначально создает один Task.Run (содержащий работу связи *) на устройство. В конце каждого такого Task.Run событие будет инициировано, так что этот обработчик событий будет запущен снова. Таким образом, при наличии 100 устройств у нас работает приблизительно 100 короткоживущих «фоновых рабочих потоков», которые все d ie и снова вызывают Task.Run в течение периода времени ~ 3 секунды. Оказывается, это кажется очень дорогим - на самом деле я подозреваю, что эта архитектура время от времени вызывает серьезные проблемы, такие как «зависание». Я понимаю, что это не лучшая практика, и что вызов Task.Run не является бесплатным, но периодическое вращение до 100 потоков не должно быть такой большой проблемой - по крайней мере, я так думаю. Мне все равно, если задачи, поставленные в очередь в пуле потоков, отрабатываются с небольшой задержкой из-за управления задачами.

Поэтому мне интересно, какая архитектура подойдет для динамично развивающегося c сокращение фоновой рабочей нагрузки, которая состоит в основном из «асинхронного» кода.

Несмотря на следующие передовые практики - действительно ли при таком подходе Task.Run / Eventhandler действительно есть большая яма?

* Основная работа состоит в установлении http-соединения и ожидании его результата. Наконец, необходимо выполнить чтение / запись в базу данных. Так что это можно сделать с помощью асин * код 1018 *.

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Для задачи, которую вы описываете, идеально подходит Durable Task Freamork . Из коробки у вас будет:

  1. возможность масштабирования (из-за архитектуры DTF используется ServiceBus и каждый экземпляр может обрабатывать работу)
  2. вы можете контролировать выполнение
  3. предоставляет возможность настроить уровень параллелизма

Также для длительной обработки можно использовать Azure Durable Function.

1 голос
/ 02 апреля 2020

Я рекомендую вам использовать Hangfire , чтобы делать это постоянно. Вы можете получить доступ к своему устройству через API-интерфейсы и вручную подключиться к нему со всеми его основными устройствами.

Он может отображать отчеты и состояние операций и потоков, а также программировать его. Я обнаружил, что он более надежен и стабилен, чем запуск потока!

С другой стороны, вы можете использовать «Шаблон проектирования наблюдателя» в своих подприложениях. Когда наступит время или событие, все подписчики в вашем коде могут сработать и ответить вам.

Вы можете прочитать больше здесь:

Шаблон проектирования наблюдателя

...