正确使用ConcurrentBag

时间:2015-11-18 16:31:27

标签: c# multithreading concurrency

编辑:谢谢你,你让我意识到下面的代码没有像我想象的那样工作,因为不知怎的,我认为cbag像hashset一样工作。对不起,你救了我一些头疼的事:):

以下函数是唯一可以更改_currentSetOfStepsProcessing的函数。可以从不同的线程调用此函数。我不确定我是否正确理解ConcurrentBag的使用,所以如果您认为这可行,请告诉我。一旦进程开始,就不会修改_stepsToDo数据结构。

<flow name="RequestReplyFlow1">
    <vm:inbound-endpoint exchange-pattern="one-way" path="request" doc:name="VM" />
    <logger message="Executing with payload: #[payload]" level="INFO" doc:name="Logger" />
    <component class="org.ram.BusinessComponent" doc:name="Java" />
    <rollback-exception-strategy maxRedeliveryAttempts="0" doc:name="Rollback Exception Strategy">
        <logger message="Will attempt redelivery" level="INFO" doc:name="Logger" />
        <on-redelivery-attempts-exceeded>
            <logger message="redelivery attempt exceeded" level="INFO" doc:name="Logger" />
            <vm:outbound-endpoint exchange-pattern="one-way" path="reply" doc:name="VM" />
        </on-redelivery-attempts-exceeded>
    </rollback-exception-strategy>
</flow>

1 个答案:

答案 0 :(得分:1)

  1. stepToDo.TryTake(out obj);可能会失败,您无法处理。
  2. 你为什么out - 引用方法参数?这只是覆盖了论点。如果扔掉它,为什么要争论呢?更可能的是,这是一种误解。
  3. can I assume it will enter here once per ConcurrentBag因为对包的访问显然是并发多个访问线程可能会看到0。所以是的,你需要更好地处理这种情况。
  4. 或许,您不应该让事情变得如此困难,并将lock与非并发数据结构结合使用。如果包装操作的频率很高,这只是个好主意。

    这个怎么样:

    foreach (/*processing step*/) {
     Parallel.ForEach(/*item in the step*/, x => { ... });
    }
    

    更简单。