gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:06:37 24 4
gpt4 key购买 nike

我正尝试在 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;
}
}

两者都给出相同的结果。

最佳答案

这里有一些您应该做的事情。首先,将创建的 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);
}

关于c# - while循环中的HttpClient只执行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54464895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com