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.虽然它有效,但我听说它必须一遍又一遍地序列化锁定的对象.有没有更好的方法呢?
你为什么不用PLinq呢?无需锁定:
changedItems = records.AsParallel()
.Where(x => x.HasChanged)
.Select(x => new ChangedItem(x))
.ToList();
Run Code Online (Sandbox Code Playgroud)
既然你正在进入一个新的列表ChangedItem并且没有任何副作用,那么这将是我认为的方式.