У меня есть основа c. Net Настольное приложение Winform. Я хотел бы сделать несколько HTTP-вызовов к Api из приложения, один HTTP-вызов занимает около 50 секунд, давайте назовем метод GetApiDataAsync()
. Я хочу позвонить GetApiDataAsync()
500+ раз. Синхронный будет слишком медленным, поэтому моя цель - запустить как можно больше параллельно. Я сделал это, создав список задач и ожидая его (var results = await Task.WhenAll(taskList)
), но я заметил, что когда размер списка занимает более 1,5 минут, я получаю исключение, которое говорит «Задача была отменена». 1,5 минуты соотносятся примерно с 4 задачами, если Task.WhenAll
ожидает больше, чем кажется, что возникает исключение.
Вот как выглядит мой код:
Вызов API
private HttpClient _client = new HttpClient();
public async Task<DataObject> GetApiDataAsync(int id)
{
return await _client.Get($"/entity/{id}");
}
Метод, объединяющий вызовы API
public async Task<IList<DataObject>> GetDataObjects(IList<int> ids)
{
var requests = ids.Select(x => GetApiDataAsync(x));
var responses = await Task.WhenAll(requests).ConfigureAwait(false);
return responses.ToList();
}
Действие пользовательского интерфейса, которое инициирует
public async void ButtonClick()
{
//First thing I tried
var data = await GetDataObjects(ids)
//Second thing I tried
var data = await Task.Run(() => GetDataObjects(ids));
dataGridView = data;
}
Я попробовал оба метода выше, но оба приводят к отмене задачи, если проходит более 1,5 минут (около 4 задач).
Вопросы:
Какая задача отменяется?
Что такое отмена задачи?
Почему задача отменяется?
Как успешно выполнить несколько HTTP-запросов параллельно?