Я использовал кавычки вокруг «правильного пути», потому что я уже хорошо знаю, что правильный способ использования асинхронного API - просто позволить асинхронному поведению распространяться по всей цепочке вызовов.Это не вариант здесь.
Я имею дело с очень большой и сложной системой, специально разработанной для синхронной пакетной обработки в цикле.
Причина, по которой я неожиданно использую HttpClient, заключается в том, чтопотому что до этого все данные для пакетной обработки собирались из базы данных SQL, и теперь мы добавляем вызов Web API в смесь.
Да, мы вызываем Web 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, и поэтому я беспокоюсь о взаимоблокировках.
«правильный способ» справиться с этим?