我试图在for循环中调用HttpClient请求,如下所示。它需要对第三方rest api进行多次连续调用。 但这只会在循环退出之前为我提供第一项服务调用结果,然后再从其余服务调用中获取结果。
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;
}
}
两个都给出相同的结果。
答案 0 :(得分:2)
这里您应该做一些事情。首先,将HttpClient
创建移到您的方法之外并使其静态。您只需要其中之一就可以了,而拥有多个可能对稳定性(see here)不利:
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);
}