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
誰かがこれについての洞察を提供し、この概念をより明確に理解できるリンクを読むことができますか。
Ernnoありがとうございます。 – Vabs
@Vabs - 問題ありません。ちなみに、私の答えがリンクしているMSDNのページには、ほぼ同じコードが含まれていることに気がつきましたか? –
うん。やった。サンプルを生成するためのベースとしてMSDNコードサンプルを使用しているかもしれない本。 – Vabs