gpt4 book ai didi

c# - 为什么在多次调用 HttpClient.GetStringAsync() 时等待一次与在每次调用时单独等待一样长?

转载 作者:太空宇宙 更新时间:2023-11-03 17:01:00 27 4
gpt4 key购买 nike

using System.Net.Http;  
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Threading.Tasks;
using System.Diagnostics;

[TestClass]
public class UnitTest1
{
[TestMethod]
public async Task ExceuteMultipleRequestsInParallel()
{
Stopwatch sw = new Stopwatch();
sw.Start();
HttpClient client = new HttpClient();
Task<string> ms = client.GetStringAsync("http://www.microsoft.com");
Task<string> msdn = client.GetStringAsync("http://msdn.microsoft.com");
Task<string> blogs = client.GetStringAsync("http://blogs.msdn.com");
await Task.WhenAll(ms, msdn, blogs);
sw.Stop();
var result = sw.Elapsed.ToString();
}

[TestMethod]
public async Task ExcecuteMultipleRequests()
{
Stopwatch sw = new Stopwatch();
HttpClient client = new HttpClient();
string ms = await client.GetStringAsync("http://www.microsoft.com");
string msdn = await client.GetStringAsync("http://msdn.microsoft.com");
string blogs = await client.GetStringAsync("http://blogs.msdn.com");
sw.Stop();
var result = sw.Elapsed.ToString();
}
}

起初我只用了一个HttpClient。我的期望是一个 await Task.WhenAll(...) 将花费最长任务所需的时间。我还期望这比用 await 调用这三个任务中的每一个任务花费的时间要少得多。

然而,事实并非如此。此外,我总是不得不评论一个,否则缓存会扭曲东西。

然后我使用了三个 HttpClients,令人惊讶的是,使用三次 await 的方法比使用 await Task.WhenAll(...) 的方法花费的时间更少。这看起来很奇怪。

有人能解释一下为什么我在第一个场景(调用一个 HttpClient 三次)中使用 WhenAll() 没有看到与我一样的运行时间改善吗在第二个中做什么(调用三个 HttpClient 实例一次)?

[TestMethod]
public async Task ExceuteMultipleRequestsInParallel()
{
Stopwatch sw = new Stopwatch();
sw.Start();
HttpClient client = new HttpClient();
HttpClient client2 = new HttpClient();
HttpClient client3 = new HttpClient();
Task<string> ms = client.GetStringAsync("http://www.microsoft.com");
Task<string> msdn = client2.GetStringAsync("http://msdn.microsoft.com");
Task<string> blogs = client3.GetStringAsync("http://blogs.msdn.com");
await Task.WhenAll(ms, msdn, blogs);
sw.Stop();
var result = sw.Elapsed.ToString();
}

[TestMethod]
public async Task ExcecuteMultipleRequests()
{
Stopwatch sw = new Stopwatch();
sw.Start();
HttpClient client = new HttpClient();
HttpClient client2 = new HttpClient();
HttpClient client3 = new HttpClient();
string ms = await client.GetStringAsync("http://www.microsoft.com");
string msdn = await client2.GetStringAsync("http://msdn.microsoft.com");
string blogs = await client3.GetStringAsync("http://blogs.msdn.com");
sw.Stop();
var result = sw.Elapsed.ToString();
}

最佳答案

您描述的行为对我来说非常正常。我认为没有理由期望单个 HttpClient 实例在任何给定时间处理多个 HTTP 操作。

因此,当您使用单个 HttpClient 实例时,如果您在第一次调用完成之前再次调用 GetStringAsync(),该类别无选择,只能简单地将操作,直到前一个完成后才开始那个。第三个操作也是如此。

当您使用三个不同的实例时,每个实例都能够独立进行,因此所有三个请求都可以同时发生。

您同时等待所有三个操作(即调用 WhenAll())的事实不能也不会改变它们在 HttpClient 内部实际执行的顺序. HttpClient 能够为您提供三个不同的任务等待并不会改变一个事实,即它自己的单个实例一次只能处理一个。由于在所有先前入队的操作完成之前最后一个操作甚至无法开始,因此您获得的基本运行时间与您只是等待每个操作依次完成然后自己入队下一个操作相同。

关于c# - 为什么在多次调用 HttpClient.GetStringAsync() 时等待一次与在每次调用时单独等待一样长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33462903/

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