Ich habe eine ConcurrentQueue mit einer Liste von URLs, die ich brauche, um die Quelle zu erhalten. Wenn Sie das Parallel.ForEach mit dem ConcurrentQueue-Objekt als den Eingabeparameter verwenden, wird die Pop-Methode nichts (sollte eine Zeichenfolge zurückgeben) nicht funktionieren.ConcurrentQueue und Parallel.ForEach
Ich verwende Parallel mit der MaxDegreeOfParallelism auf vier festgelegt. Ich muss wirklich die Anzahl der gleichzeitigen Threads blockieren. Wird eine Warteschlange mit Parallelität redundant verwendet?
Vielen Dank im Voraus.
// On the main class
var items = await engine.FetchPageWithNumberItems(result);
// Enqueue List of items
itemQueue.EnqueueList(items);
var crawl = Task.Run(() => { engine.CrawlItems(itemQueue); });
// On the Engine class
public void CrawlItems(ItemQueue itemQueue)
{
Parallel.ForEach(
itemQueue,
new ParallelOptions {MaxDegreeOfParallelism = 4},
item =>
{
var worker = new Worker();
// Pop doesn't return anything
worker.Url = itemQueue.Pop();
/* Some work */
});
}
// Item Queue
class ItemQueue : ConcurrentQueue<string>
{
private ConcurrentQueue<string> queue = new ConcurrentQueue<string>();
public string Pop()
{
string value = String.Empty;
if(this.queue.Count == 0)
throw new Exception();
this.queue.TryDequeue(out value);
return value;
}
public void Push(string item)
{
this.queue.Enqueue(item);
}
public void EnqueueList(List<string> list)
{
list.ForEach(this.queue.Enqueue);
}
}
Teilen Sie Ihre Fortschritte ... –
ItemQueue sollten sowohl von 'ConcurrentQueue' nicht ableiten und enthalten eine' ConcurrentQueue', eine auswählen. –
@Zroq: Da das Herunterladen der Quelle einer URL eine E/A-gebundene Operation ist, muss ich feststellen, dass die Parallelität das falsche Werkzeug ist. Asynchrone Parallelität würde viel weniger Ressourcen verbrauchen und genauso schnell sein. –