C# 是否使用线程从网络下载文件

C# 是否使用线程从网络下载文件,c#,.net,multithreading,C#,.net,Multithreading,我需要根据关键字从网上下载大量文件。 我下面的步骤是 使用刮削找出指向文件的链接 使用WebClient.DownloadData()下载字节[] 将arr保存到文件中 创建一个线程来下载每个文件以获得更好的性能是一个好主意。 任何建议。 谢谢 通常,服务器将从一个IP下载限制为2个连接。因此,如果所有的文件来自同一个服务器,多个线程可能没有多大帮助。 < P>你做了一个性能分析,表明你需要考虑线程吗?不那么你正在使用过早优化,你应该马上停止 您是否有多线程的经验,这样您就不太可能在锁定方面犯一

我需要根据关键字从网上下载大量文件。 我下面的步骤是

  • 使用刮削找出指向文件的链接
  • 使用WebClient.DownloadData()下载字节[]
  • 将arr保存到文件中
  • 创建一个线程来下载每个文件以获得更好的性能是一个好主意。 任何建议。 谢谢


    通常,服务器将从一个IP下载限制为2个连接。因此,如果所有的文件来自同一个服务器,多个线程可能没有多大帮助。

    < P>你做了一个性能分析,表明你需要考虑线程吗?不那么你正在使用过早优化,你应该马上停止

    您是否有多线程的经验,这样您就不太可能在锁定方面犯一些愚蠢的错误,或者,如果您确实犯了这样的错误,您将能够快速找到并修复它?不那你应该马上停下来


    您可能不清楚调试多线程程序需要多长时间。这一时间可能完全超过了使用多线程所能节省的时间。

    通常是这样,但OP询问这是否是一种改进。他提到了“大量的文件”,这就解决了你的最后一点。但是,是的,他应该测量。
    foreach (string each in arr)
            {
    
                Thread t = new Thread(
                                    new ThreadStart(
                                        delegate
                                        {
    
                                            string[] arr2 = each.Split(new string[] { "http://" }, StringSplitOptions.None);
    
                                            string[] firstElem = arr2[1].Split(new string[] { " " }, StringSplitOptions.None);
    
                                            string urlToDownload = @firstElem[0].Replace("\"", string.Empty);
                                            string filName = Path.GetFileName(urlToDownload);
                                            string dirName = DirInAppConfig();
                                            DataRow row;
                                            bool dataExistsInDtKwWithSameDownloadLinkAndFileName;
                                            getRowForKwDownLinkFileName(urlToDownload, filName, out row, out dataExistsInDtKwWithSameDownloadLinkAndFileName);
                                            downloadFile(Client, urlToDownload, dirName, filName, search, row);
                                        }));
                                    t.IsBackground = true;
                                    t.Start();
                                    t.Join();
            }