我正在尝试创建一个应用程序,通过多线程从网站下载图片,作为线程介绍的一部分。(以前从未正确使用过线程)
但目前似乎创建了1000多个线程,我不确定它们是从哪里来的。
起初,我将一个线程放入线程池中,只有一个任务在作业数组中。
foreach (Job j in Jobs)
{
ThreadPool.QueueUserWorkItem(Download, j);
}
这会在一个新线程中启动void Download(object obj)
,并循环遍历一定数量的页面(需要的图片数 / 每页42张图片)。
for (var i = 0; i < pages; i++)
{
var downloadLink = new System.Uri("http://www." + j.Provider.ToString() + "/index.php?page=post&s=list&tags=" + j.Tags + "&pid=" + i * 42);
using (var wc = new WebClient())
{
try
{
wc.DownloadStringAsync(downloadLink);
wc.DownloadStringCompleted += (sender, e) =>
{
response = e.Result;
ProcessPage(response, false, j);
};
}
catch (System.Exception e)
{
// Unity editor equivalent of console.writeline
Debug.Log(e);
}
}
}
如果我说错了,请纠正我,接下来的void函数将在同一线程上调用。
void ProcessPage(string response, bool secondPass, Job j)
{
var wc = new WebClient();
LinkItem[] linkResponse = LinkFinder.Find(response).ToArray();
foreach (LinkItem i in linkResponse)
{
if (secondPass)
{
if (string.IsNullOrEmpty(i.Href))
continue;
else if (i.Href.Contains("http://loreipsum."))
{
if (DownloadImage(i.Href, ID(i.Href)))
j.Downloaded++;
}
}
else
{
if (i.Href.Contains(";id="))
{
var alterResponse = wc.DownloadString("http://www." + j.Provider.ToString() + "/index.php?page=post&s=view&id=" + ID(i.Href));
ProcessPage(alterResponse, true, j);
}
}
}
}
最后,它传递给最后一个函数并下载实际图像。
bool DownloadImage(string target, int id)
{
var url = new System.Uri(target);
var fi = new System.IO.FileInfo(url.AbsolutePath);
var ext = fi.Extension;
if (!string.IsNullOrEmpty(ext))
{
using (var wc = new WebClient())
{
try
{
wc.DownloadFileAsync(url, id + ext);
return true;
}
catch(System.Exception e)
{
if (DEBUG) Debug.Log(e);
}
}
}
else
{
Debug.Log("Returned Without a extension: " + url + " || " + fi.FullName);
return false;
}
return true;
}
我不确定为什么会启动这么多线程,但很想知道原因。
编辑
该程序的目标是同时下载不同工作中的工作(最多5个),每个工作同时下载最多42张图片。
因此,最多可以/应该同时下载210张图片。