Ich schreibe gerade einen Sitemap-Generator, der eine Website nach URLs scrappt und eine XML-Sitemap erstellt. Da der größte Teil des Wartens auf Anfragen an Uri's liegt, verwende ich Threading, insbesondere das Build in ThreadPool-Objekt.Threading einer unbekannten Menge von Threads in C#
Damit der Hauptthread auf die unbekannte Anzahl von Threads warten kann, habe ich die folgende Konfiguration implementiert. Ich denke jedoch nicht, dass dies eine gute Lösung ist. Können mir Threading-Gurus irgendwelche Probleme mit dieser Lösung raten oder einen besseren Weg vorschlagen, sie zu implementieren?
Die Eventwaithandle wird auf EventResetMode.ManualReset
Hier ist der Thread-Methode
protected void CrawlUri(object o)
{
try
{
Interlocked.Increment(ref _threadCount);
Uri uri = (Uri)o;
foreach (Match match in _regex.Matches(GetWebResponse(uri)))
{
Uri newUri = new Uri(uri, match.Value);
if (!_uriCollection.Contains(newUri))
{
_uriCollection.Add(newUri);
ThreadPool.QueueUserWorkItem(_waitCallback, newUri);
}
}
}
catch
{
// Handle exceptions
}
finally
{
Interlocked.Decrement(ref _threadCount);
}
// If there are no more threads running then signal the waithandle
if (_threadCount == 0)
_eventWaitHandle.Set();
}
Hier ist der Haupt-Thread-Methode
// Request first page (based on host)
Uri root = new Uri(context.Request.Url.GetLeftPart(UriPartial.Authority));
// Begin threaded crawling of the Uri
ThreadPool.QueueUserWorkItem(_waitCallback, root);
Thread.Sleep(5000); // TEMP SOLUTION: Sleep for 5 seconds
_eventWaitHandle.WaitOne();
// Server the Xml Sitemap
context.Response.ContentType = "text/xml";
context.Response.Write(GetXml().OuterXml);
Irgendwelche Ideen sehr geschätzt werden :)
Das sieht sehr interessant aus, danke. Ich werde hoffentlich die Chance haben, es am Wochenende auszuprobieren.Ich kann nicht glauben, dass ich asynchrone Anfrage vergessen habe: o – WDuffy