gpt4 book ai didi

.net - .NET 4.0中的Parallel.ForEach

转载 作者:行者123 更新时间:2023-12-03 13:05:27 24 4
gpt4 key购买 nike

    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将处于线程级别或任务级别。按照本书的观点,它是在任务级别上的,但是由于一个线程可以执行多个任务,而不是变量在整个程序执行过程中如何保持其值。
我认为应该在线程级别。

有人可以提供有关此方面的见解吗?是否可以提供更多链接,以使我可以更清楚地了解这一概念。

最佳答案

此处使用的The overload of ForEach指定最后一个参数是为每个结束的任务调用的Action。

因此,在每个任务结束时,任务的结果将传递到Interlocked.Add方法,该方法将masterTotal与该任务的本地总数相加。

令人困惑的部分是这一部分:

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在这里与“任务”操作中的名称相同。

因此,它不是相同的变量,而是相同的名称。

关于.net - .NET 4.0中的Parallel.ForEach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8910152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com