2016-04-14 6 views
1

Parallel.ForEachの最初のループ内でいくつかのコードを実行したいと思います。最初のループの中でのみ。その理由は、ループ内のコードによって生成された診断データをディスクに書き込むためです。最初のループの後、データはメモリに保存され、後で集約されます。 これは動作しますか?私のコメントで述べたように Parallel.ForEachの最初のループ

bool firstLoop = true; 
Parallel.ForEach(someList, 
    p=> 
    { 
     // do something here 

     if (firstLoop) 
     { 
      firstLoop = false; 

      // do something here for the first loop 
     } 
    }); 
+1

リストの最初の項目または実行された最初のループで発生する必要がありますか?残りの反復は、最初のループで行われていることに依存していますか? – Marc

+0

いいえ、これは動作することはまったく保証されていません。 '' //ここで何かをする」のレイテンシは、(Parallel.ForEachのために)異なるスレッドによって異なるポイントでfirstLoopを調べることができ、複数回更新することができます。 –

+0

'someList.Skip(1)'と並行する前に 'someList.First()'の上に特別なコードを直接記述したいと思っています。シンプルにしておき、厄介な同期の問題を解消してください。 – spender

答えて

1

あなたが最初の項目で発生する、と繰り返しの残りが行われているものに依存しない何かが必要な場合は、あなたが最初の項目

を処理しているかどうかを確認するために、以下を使用することができます
if (p==items.First()) 
{ 
    //Do something 
} 

あなたは、ループの残りの部分は、その後に依存することを一度何かをする必要がある場合は示唆されているように、あなたはダビデでロックを使用するかは、あなたがそうParallel.ForEach

前に、あなたが必要なものを行うことができます可能性がありdo

//Do stuff using someList(0) 

Parallel.ForEach(someList.Skip(1), p=> 
+0

if(p == someList.First())これはトリックを行うようです。 – Manngo

+0

@Manngo '(p == someList.First())の問題は、最初のループではほとんど確実に実行されないということです。リストの最初の項目を含むループでのみ実行されます。 –

+0

実際、それは私には完全に十分です。私はParallel.ForEachが始めから最初のX項目で始まると仮定しました。ここで私は趣味のプログラマーだと言及する必要がありますので、正しい説明をしないと私を許してください。 – Manngo

1

、これがすべてで動作する保証はありません。 1つのオプションは、ロックを作成し、ロック内でfirstLoopを評価して更新することだけです。しかし、これにより並列処理の一部が失われ、操作を完了するのに必要な時間が迫っていない限り、より良いアプローチが求められます。

これは、firstLoopがリストの最初の項目で評価されることを保証するものではなく、一度だけ真と評価されることにのみ留意してください。

var someList = new List<string>(); 
var obj = new object(); 

for (int i = 0; i < 1000; i++) 
{ 
    someList.Add(i.ToString()); 
} 

bool firstLoop = true; 
var rand = new Random(Guid.NewGuid().GetHashCode()); 
Parallel.ForEach(someList, 
    p => 
    { 
     // do something here 
     var next = rand.Next(1, 100); 
     Thread.Sleep(next); 
     lock (obj) 
     { 
      if (firstLoop) 
      { 
       firstLoop = false; 
       firstLoop.Dump(); 
       // do something here for the first loop 
      } 
     } 
    }); 
関連する問題