Каков «правильный способ» синхронного использования HttpClient?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Каков «правильный способ» синхронного использования HttpClient?

Сообщение Anonymous »

Я использовал кавычки вокруг слова «правильный путь», потому что я уже хорошо понимаю, что правильный способ использования асинхронного API — это просто позволить асинхронному поведению распространяться по всей цепочке вызовов. Здесь это не вариант.
Я имею дело с очень большой и сложной системой, разработанной специально для синхронной пакетной обработки в цикле.
Причина, по которой я внезапно использую HttpClient, заключается в том, что раньше все данные для пакетной обработки собирались из базы данных SQL, а теперь мы добавляем к этому вызов веб-API.Да, мы вызываем веб-API в синхронно выполняющийся цикл. Я знаю. Переписать все это так, чтобы оно было асинхронным, просто не вариант. На самом деле это то, что мы хотим сделать. (Мы максимально минимизируем количество вызовов API)
На самом деле я делал попытку распространить асинхронное поведение вверх по цепочке вызовов, но потом я обнаружил, что у меня 50 файлов с глубокими изменениями, но все еще с сотнями ошибок компилятора, которые нужно устранить, и я потерял всякую надежду. Я потерпел поражение.
Итак, вернемся к вопросу, учитывая рекомендацию Microsoft никогда не использовать WebRequest для новых разработок и вместо этого использовать HttpClient, который предлагает только асинхронный API, что мне делать?
Вот псевдокод того, что я делаю...

Код: Выделить всё

foreach (var thingToProcess in thingsToProcess)
{
thingToProcess.ProcessStuff(); // This makes an API call
}
Как реализовать ProcessStuff()?
Моя первая реализация выглядела так

Код: Выделить всё

public void ProcessStuff()
{
var apiResponse = myHttpClient // this is an instance of HttpClient
.GetAsync(someUrl)
.Result;

// do some stuff with the apiResponse
}
Однако мне сказали, что вызов .Result таким образом может привести к взаимоблокировкам при вызове из чего-то вроде ASP.NET из-за контекста синхронизации.
Угадайте, что этот пакетный процесс будет запущен с контроллера ASP.NET. Да, повторюсь, я знаю, это глупо. Когда он запускается из ASP.NET, он «пакетно обрабатывает» только один элемент, а не весь пакет, но я отвлекся, он все равно вызывается из ASP.NET, и поэтому меня беспокоят взаимоблокировки.
Итак, каков «правильный способ» справиться с этим?

Подробнее здесь: https://stackoverflow.com/questions/535 ... chronously
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»