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將處於線程級別或任務級別。按照本書的規定,它處於任務級別,但由於線程可以執行多個任務,而不是在變量執行過程中變量如何保持其值。 我認爲它應該在線程級別。Parallel.ForEach in .NET 4.0

有人可以提供有關這方面的見解和可能的更多鏈接來閱讀,我可以更清楚地理解這個概念。

回答

1

The overload of ForEach這裏使用的是指定最後一個參數是爲每個結束任務調用的Action。

因此,在每個任務結束時,任務的結果將傳遞給Interlocked.Add方法,該方法使用該任務的本地總計增加m​​asterTotal。

混亂的部分是這樣的部分:

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

非常感謝Erno的清理工作。 – Vabs 2012-01-19 06:08:44

+0

@Vabs - 沒問題。順便說一下,您是否注意到我的答案鏈接到的MSDN頁面包含幾乎完全相同的代碼? – 2012-01-19 07:16:23

+0

是的。我做到了。本書可能使用MSDN代碼示例作爲生成示例的基礎。 – Vabs 2012-01-19 12:05:44