C# while循环中的HttpClient只执行一次
我试图在for循环内部调用HttpClient请求,如下所示。它需要连续多次调用第三方RESTAPI。 但它只给出了第一个服务调用结果,而在从其余服务调用获得结果之前,循环退出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
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。返回数据需要相当长的时间。