【发布时间】:2018-10-01 19:52:42
【问题描述】:
我有一个包含修改值的源列表,需要使用 Parallel.Foreach 将此更改分配给第二个列表。
我想知道这是否是线程安全的,代码示例:
Parallel.ForEach(sourceList, (srcItem) =>
{
var destItem = destinationList.FirstOrDefault(p => p.Id == srcItem.Id);
destItem.Color = srcItem.Color;
});
没事吧?还是需要设置一些同步或锁定?
【问题讨论】:
-
不是答案,但很好读:docs.microsoft.com/en-us/dotnet/api/…
-
不完整。
destItem是什么类型/类? -
destItem是一个带有框信息的 DTO 类,srcItem类型是一个 ViewModel 类,具有每个框的颜色和大小阈值。 -
似乎有点前后矛盾。如果您对性能感兴趣,那么 FirstOrDefault 调用对您不利。根据该列表的大小,使用 id 作为键的字典即使没有并行也会胜过它。除非列表很小,否则两者都做会更快。
-
另外值得注意的是OrDefault如果不存在会返回null,所以下一行会给你一个空引用异常。
标签: c# multithreading list thread-safety