编辑:谢谢你,你让我意识到下面的代码没有像我想象的那样工作,因为不知怎的,我认为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>
答案 0 :(得分:1)
stepToDo.TryTake(out obj);
可能会失败,您无法处理。out
- 引用方法参数?这只是覆盖了论点。如果扔掉它,为什么要争论呢?更可能的是,这是一种误解。can I assume it will enter here once per ConcurrentBag
因为对包的访问显然是并发多个访问线程可能会看到0
。所以是的,你需要更好地处理这种情况。或许,您不应该让事情变得如此困难,并将lock
与非并发数据结构结合使用。如果包装操作的频率很高,这只是个好主意。
这个怎么样:
foreach (/*processing step*/) {
Parallel.ForEach(/*item in the step*/, x => { ... });
}
更简单。