Мне нужно получить настраиваемые поля из ипотечного API. Проблема в том, что всего записей 11000 и на каждый запрос API уходит 1 секунда. Я хочу найти способ отправлять запросы асинхронно и параллельно, чтобы сделать это более эффективным.
Я попробовал перебрать все запросы, а затем использовать Task.WaitAll(), чтобы дождаться возврата ответа. Я получаю только два ответа, и приложение ждет бесконечно.
Сначала я настроил статический класс для HttpClient
общедоступный статический класс ApiHelper { общественный статический HttpClient ApiClient {get; набор; } публичная статическая пустота InitializeClient() { ApiClient = новый HttpClient(); ApiClient.DefaultRequestHeaders.Add("ContentType", "application/json"); } } Я собираю список своих идентификаторов ипотеки и просматриваю почтовые вызовы API
static public DataTable GetCustomFields(DataTable dt, List cf, string auth) { //устанавливаем заголовок аутентификации ApiHelper.ApiClient.DefaultRequestHeaders.Authorization = новый System.Net.Http.Headers.AuthenticationHeaderValue («Носитель», auth); //форматируем тело строка jsonBody = JArray.FromObject(cf).ToString(); var content = new StringContent(jsonBody, Encoding.UTF8, "application/json"); вар ответы = новый List(); foreach (DataRow dr в dt.Rows) { string guid = dr["GUID"].ToString().Replace("{", "").Replace("}", ""); //удаляем {} из строки ответы.Добавить(GetData(руководство, контент)); } Task.WaitAll(responses.ToArray()); //некоторый код для обработки ответов и возврата таблицы данных вернуть обновленное DT; } Для каждого вызова API требуется идентификатор ипотеки (GUID) в URL
асинхронная статическая задача GetData(string guid, StringContent json) { строка URL = "https://api.elliemae.com/encompass/v1/loans/" + guid + "/fieldReader"; Console.WriteLine("{0} запущен .....", guid); используя (ответ HttpResponseMessage = ожидайте ApiHelper.ApiClient.PostAsync(url, json)) { если (ответ.IsSuccessStatusCode) { Console.WriteLine("{0} вернул ответ....", guid); возвращение ожидания ответа.Content.ReadAsStringAsync(); } еще { Console.WriteLine(response.ReasonPhrase); выдать новое исключение (response.ReasonPhrase); } } } Сейчас я тестирую только 10 записей и отправляю все 10 запросов. Но я получаю обратно только два.
Результат:

.
Не могли бы вы посоветовать мне, как правильно отправлять одновременные вызовы API?
Мобильная версия