Я пытаюсь создать приложение, которое многопоточно загружает изображения с веб-сайта, в качестве введения в потоки. (никогда не использовалась резьба должным образом)Где эти 1k темы из
Но в настоящее время создается 1000+ потоков, и я не уверен, откуда они.
я первый в очереди поток в пул потоков, для начала я только 1 работа в массиве заданий
foreach (Job j in Jobs)
{
ThreadPool.QueueUserWorkItem(Download, j);
}
Который начинает пустоту 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 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 изображений в то время.
поэтому максимум/максимум изображений можно загрузить максимум в любое время.
Вы запускаете операцию async внутри другого потока. почему бы просто не использовать async, и это так. ? какие преимущества дает вам резьба, в данном случае? – Tigran
@ Тигран. Наверное, нет, просто пытаясь получить зависание, было бы разумнее использовать блокирующий вызов вместо асинхронного вызова, а затем в ситуации с потоками? –
Если вы используете async, не используйте threading. используйте потоки, если вы собираетесь контролировать рабочую нагрузку на параллелизм, поэтому используйте столько потоков, сколько требуется, и не более. – Tigran