Я имею дело с очень большой и сложной системой, разработанной специально для синхронной пакетной обработки в цикле.
Причина, по которой я внезапно использую HttpClient, заключается в том, что раньше все данные для пакетной обработки собирались из базы данных SQL, а теперь мы добавляем к этому вызов веб-API.Да, мы вызываем веб-API в синхронно выполняющийся цикл. Я знаю. Переписать все это так, чтобы оно было асинхронным, просто не вариант. На самом деле это то, что мы хотим сделать. (Мы максимально минимизируем количество вызовов API)
На самом деле я делал попытку распространить асинхронное поведение вверх по цепочке вызовов, но потом я обнаружил, что у меня 50 файлов с глубокими изменениями, но все еще с сотнями ошибок компилятора, которые нужно устранить, и я потерял всякую надежду. Я потерпел поражение.
Итак, вернемся к вопросу, учитывая рекомендацию Microsoft никогда не использовать WebRequest для новых разработок и вместо этого использовать HttpClient, который предлагает только асинхронный API, что мне делать?
Вот псевдокод того, что я делаю...
Код: Выделить всё
foreach (var thingToProcess in thingsToProcess)
{
thingToProcess.ProcessStuff(); // This makes an API call
}
Моя первая реализация выглядела так
Код: Выделить всё
public void ProcessStuff()
{
var apiResponse = myHttpClient // this is an instance of HttpClient
.GetAsync(someUrl)
.Result;
// do some stuff with the apiResponse
}
Угадайте, что этот пакетный процесс будет запущен с контроллера ASP.NET. Да, повторюсь, я знаю, это глупо. Когда он запускается из ASP.NET, он «пакетно обрабатывает» только один элемент, а не весь пакет, но я отвлекся, он все равно вызывается из ASP.NET, и поэтому меня беспокоят взаимоблокировки.
Итак, каков «правильный способ» справиться с этим?
Подробнее здесь: https://stackoverflow.com/questions/535 ... chronously