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
有人可以提供有關這方面的見解和可能的更多鏈接來閱讀,我可以更清楚地理解這個概念。
非常感謝Erno的清理工作。 – Vabs 2012-01-19 06:08:44
@Vabs - 沒問題。順便說一下,您是否注意到我的答案鏈接到的MSDN頁面包含幾乎完全相同的代碼? – 2012-01-19 07:16:23
是的。我做到了。本書可能使用MSDN代碼示例作爲生成示例的基礎。 – Vabs 2012-01-19 12:05:44