0

2 つParallel.ForEachのネストされたループを使用して、URL から情報をすばやく取得します。これはコードです:

while (searches.Count > 0)
{
    Parallel.ForEach(searches, (search, loopState) =>
        {
            Parallel.ForEach(search.items, item =>
                {
                    RetrieveInfo(item);
                }
            );
        }
    );
}

外側ForEachにはたとえば 10 個のリストがあり、内側ForEachには 5 個のリストがあります。これは、URL を 50 回クエリすることを意味しますが、同時に 5 回クエリします (inner ForEach)。

内部ループに遅延を追加して、URL を照会した後、x 秒間 (内部ループが 5 つの要求を完了するのにかかる時間) 待機するようにする必要があります。

Thread.Sleep完全なスレッドと、場合によっては他の並列タスクをブロックするため、使用はお勧めできません。

動作する可能性のある代替手段はありますか?

4

1 に答える 1

4

私の理解では、あなたには 50 のタスクがあり、一度に 5 つのタスクを処理したいと考えています。

その場合は、ParallelOptions.MaxDegreeOfParallelism を調べて、最大並列度 5 で 50 個のタスクを処理する必要があります。1 つのタスクが停止すると、別のタスクを開始できます。

タスクを 5 つのチャンクで処理し、その後に別の 5 つのチャンクを処理したい場合 (チャンクを連続して処理したい場合など)、次のようなコードが必要になります。

for(...)
{
   Parallel.ForEach(
      [paralleloptions,]
      set of 5, action
   )
}
于 2013-10-15T09:07:59.480 に答える