C# while循环中的HttpClient只执行一次

C# while循环中的HttpClient只执行一次,c#,.net-core,asp.net-core-mvc,dotnet-httpclient,C#,.net Core,Asp.net Core Mvc,Dotnet Httpclient,我试图在for循环内部调用HttpClient请求,如下所示。它需要连续多次调用第三方RESTAPI。 但它只给出了第一个服务调用结果,而在从其余服务调用获得结果之前,循环退出 private void Search() { try { var i = 1; using (var httpClient = new HttpCli

我试图在for循环内部调用HttpClient请求,如下所示。它需要连续多次调用第三方RESTAPI。 但它只给出了第一个服务调用结果,而在从其余服务调用获得结果之前,循环退出

 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 void Search()
{
尝试
{
var i=1;
使用(var httpClient=new httpClient())
{
而(i<5)
{
字符串url=”https://jsonplaceholder.typicode.com/posts/“+i;
var response=httpClient.GetAsync(url).Result;
字符串jsonResult=response.Content.ReadAsStringAsync().Result;
WriteLine(jsonResult.ToString());
i++;
}
}
}
捕获(例外情况除外)
{
Console.WriteLine(例如ToString());
}
}
当我使用调试点运行时,程序会给出所有结果。但是当我在没有调试点的情况下运行它时,它只给出第一个结果

我也尝试过使用async和Wait方法。这也给了我同样的结果

我觉得程序需要等待异步调用返回数据

请帮我解决这个问题

编辑-异步方式

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;
            }
        }
private async Task SearchNew()
{
尝试
{
var i=1;
var res=string.Empty;
使用(var httpClient=new httpClient())
{
而(i<5)
{
字符串url=”https://jsonplaceholder.typicode.com/posts/“+i;
var response=httpClient.GetAsync(url).Result;
字符串jsonResult=await response.Content.ReadAsStringAsync();
res=res+jsonResult+“--”;
i++;
}
}
返回res;
}
捕获(例外情况除外)
{
返回ex.消息;
}
}

两者的结果相同。

这里有几件事你应该做。首先,将
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();
}
要调用此方法,请执行以下操作:

var results = await SearchAsync();

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

这里有几件事你应该做。首先,将
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();
}
要调用此方法,请执行以下操作:

var results = await SearchAsync();

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

你真的不应该在每个循环上创建一个新的HttpClient。你应该学习如何使用async/await,使用
。Result
是危险的。除此之外,这段代码应该可以正常工作(假设你只希望它循环4次),你只需要一个HttpClient在while循环之外。对于for循环中的每个循环,您只需要一个新的响应。感谢您的回复。我根据你的回答编辑了这个问题。我正在调用google place API。返回数据需要相当长的时间。你真的不应该在每个循环上创建新的HttpClient。你应该学习如何使用async/await,使用
。结果
是危险的。除此之外,这段代码应该可以正常工作(假设你只希望它循环4次)在while循环之外,您只需要一个HttpClient。对于for循环中的每个循环,您只需要一个新的响应。感谢您的回复。我根据你的回答编辑了这个问题。我正在调用GooglePlaceAPI。返回数据需要相当长的时间。