Задать вопрос
@sansansan3

Имеет ли смысл использовать асинхронные вызовы в консольных программах Don net core, если алгоритм обработки последователен?

Написал программу импорта данных в БД из внешнего REST-сервиса.
Программа написана как консольное приложение на dot net core на языке C#.
Она запускается по расписанию каждые 30 минут из Sheduler'а Windows.

Основный цикл имеет вид:

Данные = СчитатьДанныеИзREST();
while (Данные != NULL) {
      СохранитьДанныеВБд(Данные);
      Данные = СчитатьДанныеИзREST();  
}

Сейчас я написал программу без использования асинхронных методов получения данных и их записи в БД. Для получения данных из REST и сохранения их в БД использую синхронные методы:
  • WebRequest GetResponse() - для получения данных из REST
  • Dapper Execute() - для сохранения данных в БД


Как видно из псевдокода основного цикла программы, данные запрашиваются и обрабатываются сугубо последовательно. И это меня полностью устраивает - мне нет необходимости обрабатывать их параллельно/асинхронно. Программа никак не работает с потоками (Threads) и одновременно не будут запускаться несколько копий программы.

Однако для получения данных из REST и сохранения их в БД можно использовать асинхронные версии тех же методов (ИмяМетодаAsync):
  • WebRequest GetResponseAsync() - для получения данных
  • Dapper ExecuteAsync() - для сохранения данных в БД


Вопрос: имеется ли причина переделывать программу, чтобы она использовала асинхронные методы вместо синхронных? Есть ли от этого какие-нибудь плюсы в тех условиях, что я описал? Плюсы вроде: исполняющая среда dot net core будет экономнее использовать процессоров время/ресурсы для других задач, а сейчас она просто тупо висит в ожидании, когда идет ожидание получения данных из REST или при сохранении данных в БД?

Я понимаю, как писать async/await при вызове и в декларациях функций. Для меня это не проблема. Я понимаю, что вместо обычного метода будет сгенерирован системой автомат состояний, что будет кушать ресурсы.

Вопрос можно переформулировать более обще: имеет ли смысл использовать асинхронные вызовы в консольных программах Don net core, если алгоритм обработки последователен?
  • Вопрос задан
  • 147 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 2
@none7
Асинхронность в C# это кооперативная многозадачность. Если многозадачность внутри процесса не нужна, то и асинхронность тоже. Наоборот будет немного медленнее работать и жрать чуть больше памяти. Когда синхронная задача ждёт данных, она не занимает процессорное время. Поток уходит в ядро ОС и диспетчер потоков переключается на другой поток или уводит процессорное ядро в режим ожидания.
Ответ написан
Комментировать
В консольном приложении вы в любом случае не увидите большой разницы, но имхо, лучше сразу делать асинхронным, чтобы можно было скопипастить туда, где это уже будет иметь большой смысл

А ещё вместо WebRequest лучше использовать HttpClient
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@sansansan3 Автор вопроса
Спасибо за оперативный развернутый ответ.
Когда синхронная задача ждёт данных, она не занимает процессорное время. Поток уходит в ядро ОС и диспетчер потоков переключается на другой поток или уводит процессорное ядро в режим ожидания.

Тут я слегка не понял - если при вызове синхронного метода осуществляется ожидание "без потерь", то зачем тогда вся эта асинхронность, ведь и так все отлично? Зачем тогда придумали async/await?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы