您可以使用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
});