while循环中的HttpClient只执行一次

Jan*_*ana 3 c# dotnet-httpclient asp.net-core-mvc .net-core

我试图在 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());
                }
            }
Run Code Online (Sandbox Code Playgroud)

当我使用调试点运行时,程序会给出所有结果。但是当我在没有调试点的情况下运行它时,它只给出第一个结果。

我也尝试使用 async、await 方法。它也给了我同样的结果。

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

请帮我解决这个问题。

编辑-异步方式

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;
            }
        }
Run Code Online (Sandbox Code Playgroud)

两者都给出相同的结果。

Dav*_*idG 6

这里有一些你应该做的事情。首先,将HttpClient创建移到方法之外并使其静态。您只需要其中之一,而拥有多个可能对稳定性非常不利(请参见此处):

private static HttpClient _client = new HttpClient();
Run Code Online (Sandbox Code Playgroud)

接下来,将对 的调用提取到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();
}
Run Code Online (Sandbox Code Playgroud)

最后,您创建一个任务列表并使用以下命令等待它们全部异步完成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);
}
Run Code Online (Sandbox Code Playgroud)

并调用这个方法:

var results = await SearchAsync();

foreach (var result in results)
{
    Console.WriteLine(result);
}
Run Code Online (Sandbox Code Playgroud)