gpt4 book ai didi

c#-4.0 - ParallelQuery.ForAll 方法中的增量 ID

转载 作者:行者123 更新时间:2023-12-04 05:34:21 27 4
gpt4 key购买 nike

我有一个需要同时处理的文件列表。我尝试使用 ParallelQuery 类的 ForAll 扩展方法。我没有按顺序处理文件,所以我使用了 ForAll。

这是我的示例代码:

List<FileInfo> files = GetFilesToProcess();

files.AsParallel().ForAll(f => { // Process file here });

它工作得很好,但现在我需要为每个文件生成一个唯一的整数 ID,我不知道如何在不将 AsParallel.ForAll 更改为 ForEach 的情况下执行此操作。

我在某处读到我需要作为 Interlocked 但仍然会出现问题。

希望你能在这里给我一个想法。

谢谢!

最佳答案

您可以使用 Interlocked.Increment生成 ID,或者您可以直接使用索引:

List<FileInfo> files = GetFilesToProcess();

files.AsParallel().Select((f, i) => new {File=f, ID=i})
.ForAll(fp =>
{
FileInfo file = fp.File;
int id = fp.ID; // ID is the index in the list

// Process file here
});

如果您想使用 Interlocked.Increment ,你可以这样做:
List<FileInfo> files = GetFilesToProcess();
int globalId = -1;

files.AsParallel().ForAll(f =>
{
// Process file here
int id = Interlocked.Increment(ref globalId);
// use ID
});

话虽如此,如果您的整个目标是对集合进行“工作”,我建议将其编写为 Parallel.For 或 Parallel.ForEach。这更清楚,因为您使用 LINQ 样式语法不是为了产生副作用:
List<FileInfo> files = GetFilesToProcess();
Parallel.For(0, files.Count, i =>
{
var file = files[i];
// Use i and file as needed
});

关于c#-4.0 - ParallelQuery.ForAll 方法中的增量 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12151088/

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