Почему моя задача отменяется (и что отменяет ее) в моем приложении *. Net WinForm? - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть основа 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-запросов параллельно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...