【问题标题】:Is Parallel.Foreach safe to assign values to target list items?Parallel.Foreach 是否可以安全地将值分配给目标列表项?
【发布时间】: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


【解决方案1】:

如果有这样的条件

1) 保证源id 和目标id 之间存在一对一映射

2) destinationListParallel.ForEach 期间永远不会改变,它的内容也不会改变,除了分配Color

运行这段代码应该是安全的,不需要同步。

【讨论】:

  • 和源列表上的id字段不同
  • 是的,是一对一的,实际上代码可以改成destinationList.Single(),列表永远不会只改变destItem的属性。
  • @scumbag:那么,您可以安全地并行化,在这种情况下不需要进一步同步。
猜你喜欢
  • 2020-02-12
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 2019-09-09
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
相关资源
最近更新 更多