这段代码应该发送2到7个请求以同时获取数据以减少等待时间。在我的计算机上,代码运行需要6秒钟。当我将其上传到Azure时,需要60秒。如果我打开Azure版本的2个窗口并将它们并排运行,则需要120秒。在我看来,他们要么不是像我想要的那样同时运行,要么同时多次调用是服务器的瓶颈。有没有人有任何想法?
List<string> strs = new List<string>();
Parallel.For(0, uriArray.Count(), index =>
{
using (var client = new HttpClient())
{
var response = client.GetAsync(uriArray[index]).Result;
if (response.IsSuccessStatusCode)
{
var responseContent = response.Content;
var responseString = responseContent.ReadAsStreamAsync().Result;
using (GZipStream zip = new GZipStream(responseString, CompressionMode.Decompress, true))
using (StreamReader unzip = new StreamReader(zip))
{
strs.Add(unzip.ReadToEnd());
}
}
}
});
答案 0 :(得分:1)
Parallel.*
方法适用于CPU绑定工作,因为它们使用基于CPU的启发式方法来选择并行度。对于基于IO的工作,这些启发式方法完全失败。 IO 的最佳DOP必须根据经验确定。它不能从CPU核心数量中获得。
VM只有1
你去吧。在较小的VM上,您将不那么频繁地进行HTTP调用,这显然是无意义的,因为HTTP调用消耗的CPU很少。
使用https://blogs.msdn.microsoft.com/pfxteam/2012/03/05/implementing-a-simple-foreachasync-part-2/中的最后一段代码来处理具有固定并行度的工作项。作为额外的好处,您可以放弃.Result
来电。
.NET Framework可耻地没有任何内置功能,这就是为什么你必须使用博客中的代码。