2
private static Int64 DirectoryBytes(String path) 
    { 
     var files = Directory.EnumerateFiles(path); 
     Int64 masterTotal = 0; 
     ParallelLoopResult result = Parallel.ForEach<String, Int64>(
     files, 
     () => 
     { // localInit: Invoked once per task at start 
      // Initialize that this task has seen 0 bytes 
      return 0; // Set taskLocalTotal initial value to 0 
     }, 
     (file, loopState, index, taskLocalTotal) => 
     { // body: Invoked once per work item 
      // Get this file's size and add it to this task's running total 
      Int64 fileLength = 0; 
      FileStream fs = null; 
      try 
      { 
       fs = File.OpenRead(file); 
       fileLength = fs.Length; 
      } 
      catch (IOException) { /* Ignore any files we can't access */ } 
      finally { if (fs != null) fs.Dispose(); } 
      return taskLocalTotal + fileLength; 
     }, 
     taskLocalTotal => 
     { // localFinally: Invoked once per task at end 
      // Atomically add this task's total to the "master" total 
      Interlocked.Add(ref masterTotal, taskLocalTotal); 
     }); 
     return masterTotal; 
    } 

これは私が本から得たコードです。私はこれに疑問がある。 変数tasklocaltotalはスレッドレベルまたはタスクレベルになります。本書のように、それはタスクレベルですが、スレッドが複数のタスクを実行できるようになるのは、変数がプログラムの実行中にどのようにその値を保持しているかというよりもむしろです。 スレッドレベルにあるべきだと思います。.NET 4.0のParallel.ForEach

誰かがこれについての洞察を提供し、この概念をより明確に理解できるリンクを読むことができますか。

答えて

1

The overload of ForEachここでは、最後のパラメータが終了タスクごとに呼び出されるアクションであることを指定しています。

各タスクの終了時に、タスクの結果は、そのタスクのローカル合計でmasterTotalをインクリメントするInterlocked.Addメソッドに渡されます。

taskLocalTotal => 
{ 
    // localFinally: Invoked once per task at end 
    // Atomically add this task's total to the "master" total 
    Interlocked.Add(ref masterTotal, taskLocalTotal); 
} 

が同じようにそれを考える(あなたがたとしても、それを書くことができます):

紛らわしい部分はこの部分である

x => 
{ 
    // localFinally: Invoked once per task at end 
    // Atomically add this task's total to the "master" total 
    Interlocked.Add(ref masterTotal, x); 
} 

taskLocalTotalは、残念ながら、タスクの中に、ここで同じ名前を持ちますアクション。

したがって、同じ変数ではなく同じ名前です。

+0

Ernnoありがとうございます。 – Vabs

+0

@Vabs - 問題ありません。ちなみに、私の答えがリンクしているMSDNのページには、ほぼ同じコードが含まれていることに気がつきましたか? –

+0

うん。やった。サンプルを生成するためのベースとしてMSDNコードサンプルを使用しているかもしれない本。 – Vabs