Foreach循环和带锁定的变量

Ric*_*zak 2 c# task-parallel-library

基本上我想要做的就是这个伪代码

List<DatabaseRecord> records;

List<ChangedItem> changedItems;

Parallel.ForEach<DatabaseRecord>(records, (item, loopState) =>
{
    if (item.HasChanged)
    {
        lock (changedItems)
        {
            changedItems.Add(new ChangedItem(item));
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

但我担心的是锁定changedItems.虽然它有效,但我听说它必须一遍又一遍地序列化锁定的对象.有没有更好的方法呢?

Bro*_*ass 9

你为什么不用PLinq呢?无需锁定:

changedItems = records.AsParallel()
                      .Where(x => x.HasChanged)
                      .Select(x => new ChangedItem(x))
                      .ToList();
Run Code Online (Sandbox Code Playgroud)

既然你正在进入一个新的列表ChangedItem并且没有任何副作用,那么这将是我认为的方式.