【问题标题】:Parallel.ForEach and shared safe collection!Parallel.ForEach 和共享安全集合!
【发布时间】:2011-06-20 22:00:51
【问题描述】:

我无法弄清楚为什么我的以下代码无法正常工作。这是它的简化版

public class TheClass
{
    protected void SomeMethod(List<string> works)
    {
         ConcurrentBag<MyResult> mySafeCollection= new ConcurrentBag<MyResult>();

         Parallel.ForEach(works, work=>
            { 
                   mySafeCollection.Add(GetResult(work));

            }
    }

    private MyResult GetResult(string work)
    {
        ResultClass result = new ResultClass ();
        result.Id = "some text";
        //Some work here to set result.Value
        return result;
     }
}

正如所见,我有一个类,它获取一个字符串列表,工作,然后调用一些本地方法,该方法完成一些工作并返回一个结果对象。我希望 mySafeCollection 中的项目数始终与作品数相同,并且 mySafeCollection 中的所有项目都不会为空,因为我为每次调用返回结果对象的新实例,但事实并非如此!!!有时 mySafeCollection 缺少一项或一项其元素为空,这意味着 GetResult 已返回空。这根本不符合逻辑!每次调用 GetResult 方法都会创建结果。我最初认为这将是因为 mySafeCollection 集合,它曾经是一个列表,问题是由于 List.Add 方法上的 conrreuncy 问题,但即使切换到 ConcurrentBag 也没有解决问题。有什么线索吗?

【问题讨论】:

  • 你为什么不用.AsParallel().Select
  • 与您发布的代码类似的代码应该可以工作。您能否发布一个可以编译但无法正常工作的小示例?
  • .AsParallel().Select 将如何提供帮助?不是一样的吗?不幸的是,要共享的代码要大得多

标签: .net c#-4.0 concurrency parallel-processing


【解决方案1】:

我假设这是一个竞争条件。 Parallel.ForEach 的重载之一是

Action<TLocal> localFinally

如果您使用该操作来捕获 finally,它应该让您有机会在您仍然可以对其采取措施的时候做出响应。

【讨论】:

  • 这是一个竞争条件,但它可能在哪里?你能解释一下你所说的代码是什么意思吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 2013-12-02
  • 2021-09-29
  • 1970-01-01
相关资源
最近更新 更多