Task.Parallel.For似乎没有并行运行

时间:2016-10-17 15:03:30

标签: c# asp.net-mvc azure

这段代码应该发送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());
            }
        }
    }
});

1 个答案:

答案 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可耻地没有任何内置功能,这就是为什么你必须使用博客中的代码。

相关问题