- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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/
我有一种使用 Google API 翻译文本的工作方法,如下所示; public string TranslateText(string input, string sourceLanguage, s
我有(我的 url 列表大约有 1000 个 url),我想知道是否有更有效的调用来自同一站点的多个 url(已经更改 ServicePointManager.DefaultConnectionLim
新的 ASP.NET Web API HttpClient 一直给我一些奇怪的结果。这是我的代码: class Program { static async void Main(string[
using System.Net.Http; using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Threading.
我正在尝试使用 GetStringAsync 方法访问我的 url,但调用挂起并且永远不会结束。当我在浏览器中检查它时它工作完美但不知何故在我的代码中它永远不会结束。我的代码: public bool
我正在使用 Windows Phone/Store 应用程序的新运行时开发 Windows 通用应用程序。我正在使用以下代码向服务器发送请求并期待返回 HTML 响应。但是,当我返回字符串并将其显示在
我认为 HttpClient 应该能够处理 301 错误代码,并重定向到正确的地址。但是对于以下地址 ( https://www.npr.org/templates/rss/podcast.php?i
我有一个控制台应用程序,用户输入一个字符串(一个数字,例如“1”),我根据输入的数字发出GET请求,并返回GET的字符串结果。 我想异步执行,因为一般来说,所有 I/O 操作都应该是异步的,所以我基本
我有以下内容,我尝试从服务器下载一个字符串: HttpClient client = new HttpClient(); var getResponsestring = await client.Ge
我有一个 Windows Phone 8 项目,我也开始使用 PCL(可移植类库)项目,因为我要构建一个 Win8 应用程序。 但是,在调用我的 api(在 Azure 中)时,我的 HttpClie
我是 C# 的新手,更不用说 Windows Phone 开发了:) 我正在尝试发送请求,获取 JSON 响应,但如果出现错误(例如 401),则能够告诉用户此类。这是我的代码: async Task
如果你有以下方法: public async Task GetTAsync(url) { return await httpClient.GetStringAsync(url); } publ
我真的是 Xamarin 开发的新手,我刚刚尝试使用 Xamarin.Forms 来使用共享代码开发 Android 和 iOS 应用程序,我在这里要做的是使用 Plugin.RestClient N
最近,我开发了一个WP8的应用程序,一开始一切正常。但是,从昨天晚上开始,我在尝试从 url 检索 RSS 数据 时遇到错误。 这是我用来获取数据的部分代码: try { HttpClient
在winform中,点击按钮调用此方法将链接内容下载为字符串,然后在文本框中显示字符串长度。这一切都是异步发生的。有没有办法同步执行此操作? 最佳答案 您可以通过获取.Result来创建任何任务 bl
我正在关注这个 blog post关于如何在 ASP.NET Web API 2 中使用批处理支持。服务器代码似乎可以工作并监听端口 12345。 当我运行客户端代码时,它到达这一行: dynam
我有以下代码 static void Main(string[] args) { string url = "http://www.google.com"; Conso
本文转载自微信公众号「汪宇杰博客」,作者汪宇杰。转载本文请联系汪宇杰博客公众号。 在 ASP.NET Core 单元测试中模拟HttpClient.GetStringAsync()
我正在创建一个新的 Windows 8.1 应用程序,只是为了测试我遇到的这个错误。该应用只有一个功能: private async void TestMethod() {
我是一名优秀的程序员,十分优秀!