私はソースを取得する必要があるURLのリストを持つConcurrentQueueを持っています。 ConcurrentQueueオブジェクトを入力パラメーターとして使用してParallel.ForEachを使用する場合、Popメソッドは何も動作しません(文字列を返す必要があります)。ConcurrentQueueとParallel.ForEach
私はMaxDegreeOfParallelismを4に設定してParallelを使用しています。私は本当に同時スレッドの数をブロックする必要があります。並列処理のキューを冗長使用していますか?
ありがとうございます。
// 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);
}
}
あなたの進捗状況を共有する... –
ItemQueueがConcurrentQueue' 'から派生し、' ConcurrentQueue'が含まれている、ものを選ぶべきではありません両方。 –
@Zroq:URLのソースをダウンロードすることはI/O制限の操作なので、その並列性は間違ったツールであると述べなければなりません。非同期の並行処理では、リソースが大幅に削減され、高速に処理されます。 –