2

  var options = new ParallelOptions()
  {
      MaxDegreeOfParallelism = 10
  };

  List<string> lstAllUrls = File.ReadAllLines("myList.txt").ToList<string>();

  Parallel.ForEach(lstAllUrls, options, myFunctionThatFetchPage);

これで問題なく動作します。私が知りたいのは、現在どの反復にいるのかをどのように知ることができるかということです。つまり、私のリストに 100000 個の URL があるとしましょう。それらを取得し始めます。しかし、現在どの URL が取得されているかを画面に出力したいとも考えています。

どうやってやるの?指定されたリストのどの項目で現在ループしているかを知るにはどうすればよいですか?

4

3 に答える 3

11

の次のオーバーロードを使用できますParallel.ForEach

public static ParallelLoopResult ForEach<TSource>(
    IEnumerable<TSource> source,
    Action<TSource, ParallelLoopState, long> body
)

3 番目のパラメーターで、現在の要素のインデックスをデリゲートに渡します。

于 2013-05-01T11:21:14.920 に答える
5

アイテムは URL 処理デリゲートに並行して提供されるため、リスト インデックスが順不同で「見える」場合があります。これは通常、"M out of N"メッセージに必要なものではありません。

これを修正する 1 つの方法は、メカニズムInterlocked.Incrementとは別に設定したカウンターで使用することです。ForEach

private int count;
...
void MyForEachDelegate(string urlStr) {
    ...
    int pos = Interlocked.Increment(ref count);
    if ((pos-1) % 1000 == 0) {
        Console.WriteLine("Processing URL number {0}", pos);
    }
}
于 2013-05-01T11:27:16.230 に答える
0

私の知る限り、Parallel.ForEach は foreach のいとこのようなものです。どの反復にあるかを知るのは苦手です。代わりに Parallel.For を使用し、ループ変数を使用して位置を伝えることができます。一般に、共有リソースにアクセスするループ内で何かを行うと、並列度が低下する可能性があることに注意してください。進行状況バーコードなどを使いすぎないようにしてください。

于 2013-05-01T11:33:07.393 に答える