Próbuję utworzyć aplikację, która pobiera wiele wątków ze strony internetowej, jako wprowadzenie do wątków. (nigdy wcześniej nie używałem poprawnie gwintowania)Skąd te wątki 1k pochodzą z
Ale obecnie wydaje się, że tworzymy ponad 1000 wątków i nie jestem pewien, skąd pochodzą.
raz pierwszy w kolejce wątku w puli wątków, na początek mam tylko 1 pracę w tablicy zatrudnienia
foreach (Job j in Jobs)
{
ThreadPool.QueueUserWorkItem(Download, j);
}
który rozpoczyna pustkę Download(object obj)
w nowym wątku, gdzie pętle za pośrednictwem pewnej ilości stron (obrazy potrzebne/42 obrazów na stronie)
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);
}
}
}
mnie poprawić, jeśli się mylę, kolejna pustka zostanie wywołany w tym samym wątku
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);
}
}
}
}
I wreszcie przechodzi do ostatniej funkcji i pobiera rzeczywisty obraz
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;
}
Nie jestem pewien, jak ja zaczynam to wiele wątków, ale chcielibyśmy wiedzieć.
Edit
Celem tego programu jest, aby pobrać inną pracę w pracy w tym samym czasie (max 5) każdy pobierany maksymalnie 42 zdjęć na raz.
, aby maksymalnie 210 zdjęć można było/powinno się pobrać maksymalnie przez cały czas.
uruchamiasz operację asynchroniczną wewnątrz innego wątku. dlaczego po prostu nie używać async i to jest. ? jakie korzyści zapewnia Tobie w tym przypadku? – Tigran
@ Tigran Prawdopodobnie żaden, po prostu próbując uzyskać powolny wątek, czy byłoby sensowniej użyć wywołania blokującego zamiast wywołania asynchronicznego, a następnie w sytuacji wątku? –
Jeśli używasz asynchronizacji, nie używaj wątków. używaj wątków, jeśli zamierzasz kontrolować obciążenie pracą współbieżności, tak aby obejmował tyle wątków, ile jest wymagane, a nie więcej. – Tigran