【问题标题】:Parallel.For synchronization with null objectsParallel.For 与空对象同步
【发布时间】:2010-10-15 03:03:18
【问题描述】:

我正在使用System.Threading.Tasks.Parallel.For 做一些重量级的处理。

我的代码是:

int count = 10;
List<MyObj> results = new List<MyObj>();

Parallel.For(0, count, (index) =>
{
   MyObj obj = GetMyObjMaybe();

   if (obj != null)
      results.Add(obj);
});

if (results.Contains(null))
{
   //break here, and it does
}

//sometimes contains null objects
return results;
}

我不希望在列表中得到空值,但我是。我一定是在搞砸index 的使用。有什么想法吗?

【问题讨论】:

  • c 中的results.Add(c) 是什么?

标签: c# task-parallel-library


【解决方案1】:

您的List&lt;MyObj&gt; results 不是线程安全的。

您看到的是空值,因为results 在许多方面可能是无效的。

要么使用Thread-safe collection class,要么使用lock 语句保护对results 的每次访问。

【讨论】:

  • 谢谢你,亨克。我认为 List 至少对于并发添加来说是线程安全的。一个简单的锁定对象解决了这个问题。再次感谢。
  • "您可以在 5 分钟内接受答案。" -所以。我会回来的:P
  • @bufferz - 一般而言,假设集合可能对于并发读取是安全的,但对于并发写入或混合读取/写入几乎不安全。然后在文档中检查您的假设。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多