Ich versuche, eine Anwendung zu erstellen, die Multi-Thread-Downloads Bilder von einer Website, als eine Einführung in Threading. (nie zuvor richtig Threading verwendet)Wo kommen diese 1k Threads von
Aber im Moment scheint es 1000+ Threads zu erstellen und ich bin mir nicht sicher, woher sie kommen.
ich zum ersten Mal eines Thread in einen Thread-Pool Warteschlange, für den Anfang, ich habe nur 1 Job im Job Array
foreach (Job j in Jobs)
{
ThreadPool.QueueUserWorkItem(Download, j);
}
, die die Leere Download(object obj)
auf einen neuen Thread beginnt, wo es durch eine bestimmte Anzahl von Seiten Schleifen (Bilder benötigt/42 Bilder pro Seite)
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);
}
}
}
korrigiert mich wenn ich falsch bin, wird die nächste Lücke wird auf dem gleichen Thread genannt
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);
}
}
}
}
und gelangt schließlich in die letzte Funktion auf und lädt das aktuelle Bild
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;
}
Ich bin nicht sicher, wie ich so viele Threads bin ab, würde aber gerne wissen.
bearbeiten
Das Ziel dieses Programms ist es, die verschiedenen Jobs in Jobs zur gleichen Zeit (maximal 5), das jeweils das Herunterladen eines maximal 42 Bilder zur Zeit zum Download bereit.
so können maximal 210 Bilder zu jeder Zeit maximal heruntergeladen werden.
Sie führen asynchrone Operation in einem anderen Thread aus. Warum verwenden Sie nicht nur async und das ist. ? Welche Vorteile bietet Ihnen Threading in diesem Fall? – Tigran
@Tigran Wahrscheinlich keine, nur versucht, das Gewinde des Threads zu bekommen, wäre es sinnvoller, den blockierenden Aufruf anstelle des asynchronen Aufrufs dann in einer Threading-Situation zu verwenden? –
Wenn Sie Async verwenden, verwenden Sie kein Threading. Verwenden Sie Threads, wenn Sie die Arbeitslast für Parallelität steuern möchten. Überspannen Sie so viele Threads wie erforderlich und nicht mehr. – Tigran