HttpClient в цикле while выполняется только один раз - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь вызвать запрос HttpClient внутри цикла for следующим образом.Для этого нужно сделать несколько последовательных звонков на сторонние api rest.Но он дает мне только первый результат вызова службы при выходе из цикла до получения результата от остальной части вызова службы.

 private void Search()
            {
                try
                {
                    var i = 1;
                    using (var httpClient = new HttpClient())
                    {
                        while (i < 5)
                        {
                            string url = "https://jsonplaceholder.typicode.com/posts/" + i;
                            var response = httpClient.GetAsync(url).Result;
                            string jsonResult = response.Content.ReadAsStringAsync().Result;
                            Console.WriteLine(jsonResult.ToString());
                         i++;                     
                        }

                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }

Когда я запускаю с точками отладки, программа выдает мне весь результат.Но когда я запускаю его без точек отладки, он дает мне только первый результат.

Я пробовал это с использованием асинхронных методов, также ждите методы.Это также дает мне тот же результат.

Поскольку я чувствую, что Программе нужно ждать, пока асинхронный вызов не вернет данные.

Пожалуйста, помогите мне решить эту проблему.

РЕДАКТИРОВАТЬ - асинхронный путь

private async Task<string> SearchNew()
        {
            try
            {
                var i = 1;
                var res = string.Empty;
                using (var httpClient = new HttpClient())
                {
                    while (i < 5)
                    {


                        string url = "https://jsonplaceholder.typicode.com/posts/" + i;
                        var response = httpClient.GetAsync(url).Result;
                        string jsonResult = await response.Content.ReadAsStringAsync();

                        res = res + jsonResult + " --- ";
                        i++;
                    }

                }

                return res;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

Оба дают одинаковый результат.

1 Ответ

0 голосов
/ 31 января 2019

Здесь есть несколько вещей, которые вы должны делать.Во-первых, переместите создание HttpClient за пределы вашего метода и сделайте его статичным.Вам нужен только один из них, и наличие нескольких может быть очень плохим для стабильности ( см. Здесь ):

private static HttpClient _client = new HttpClient();

Далее, извлеките вызовы HttpClient в один метод,что-то простое, как это:

//Please choose a better name than this
private async Task<string> GetData(string url)
{
    var response = await _client.GetAsync(url);
    return await response.Content.ReadAsStringAsync();
}

И, наконец, вы создаете список задач и ожидаете их асинхронного завершения, используя Task.WhenAll:

private async Task<string[]> SearchAsync()
{
    var i = 1;

    var tasks = new List<Task<string>>();

    //Create the tasks
    while (i < 5)
    {
        string url = "https://jsonplaceholder.typicode.com/posts/" + i;
        tasks.Add(GetData(url));
        i++;
    }

    //Wait for the tasks to complete and return
    return await Task.WhenAll(tasks);
}

И для вызова этого метода:

var results = await SearchAsync();

foreach (var result in results)
{
    Console.WriteLine(result);
}
...