为什么使用多线程不能提高性能?

时间:2017-08-18 19:15:41

标签: c# multithreading webclient

所以我一直在尝试使用c#WebClient。我设法制作了一个工作程序(控制台应用程序),其代码类似于:

static void Search(string number)
{
    using (var client = new WebClient())
    {
        for (int a = 0; a < globalvariable.lenght; a++)
        {
            string toWrite = "nothing";
            for (int b = 0; a < globalvariable2.lenght; b++)
            {
                string result = client.DownloadString(urlString);
                //do stuff with toWrite if page is not empty
                //change toWrite and break the b loop
            }
            Console.WriteLine(toWrite);
        }
    }
}

它不是很快,所以我认为我可以通过使用多个线程来加快速度。 执行需要2分钟。

所以我尝试将循环设为Parallel.For循环。它仍然需要2分钟才能执行。所以我在这里阅读了一些内容并制作了以下代码:

static async Task AWrite(string number, int a) 
{
    using (var client = new WebClient())
    {
        string toWrite = "nothing";
        for(int b=0; a<globalvariable2.lenght; b++)
        {
            string result = await client.DownloadStringTaskAsync(uri);
            //do stuff with toWrite if page is not empty
            //change toWrite and break the b loop
        }
        Console.WriteLine(toWrite);
    }
}

然后调用它的函数:

private static void ASearch(string number)
{
    var tasks = new List<Task>();
    for(int a=0; a<gobalvariable.Length; a++)
    {
        tasks.Add(AWrite(number, a));
    }
    Task.WaitAll(tasks.ToArray());
}

所以我认为多个WebClient会同时下载字符串,显然这不会发生,因为这也需要两分钟才能执行。这是为什么?通过在控制台中写入,我知道它们没有按顺序执行,但它仍然需要相同的时间。如何通过使用多个线程来实际提高第一个函数的性能?

2 个答案:

答案 0 :(得分:1)

您可以更改HTTP连接限制:

System.Net.ServicePointManager.DefaultConnectionLimit = 5;

查看ServicePointManager.DefaultConnectionLimit以及ServicePoint课程中的文章。使用此属性,您可以更改HTTP连接的默认连接限制。

答案 1 :(得分:1)

最终限制在我正在下载的网站中。它限制为每人1个HTTP连接。谢谢你们的想法。