【发布时间】:2015-11-18 16:31:27
【问题描述】:
编辑:谢谢,你让我意识到下面的代码不像我想象的那样工作,因为不知何故我认为 cbag 像一个哈希集一样工作。对不起,你让我有些头疼:)
以下函数是唯一可以改变_currentSetOfStepsProcessing 的函数。这个函数可以被不同的线程调用。我不确定我是否正确理解了 ConcurrentBag 的使用,所以请让我知道您认为这是否可行。 _stepsToDo 数据结构一旦进程开始就永远不会被修改。
void OnStepDone(InitialiseNewUserBase obj)
{
var stepToDo = _stepsToDo[_currentSetOfStepsProcessing];
stepToDo.TryTake(out obj);
if (stepToDo.Count == 0) //can I assume it will enter here once per ConcurrentBag?
{
if (_currentSetOfStepsProcessing < _stepsToDo.Count - 1)
{
_currentSetOfStepsProcessing++;
}
}
}
List<ConcurrentBag<InitialiseNewUserBase>> _stepsToDo = new List<ConcurrentBag<InitialiseNewUserBase>>();
Action _onFinish;
int _currentSetOfStepsProcessing;
【问题讨论】:
-
这将从包中取出一件物品,然后返回,如果有物品的话。您可能希望循环并将您从包中获取的任何内容分配给局部变量。
-
看起来您正在尝试实现队列队列,如果是这样,
ConcurrentQueue可能是更合适的数据结构。有什么理由需要嵌套结构而不是所有工作的简单扁平队列? -
@Ian 是的,我需要优先级。 ConcurrentBag 0 的元素必须在 ConcurrentBag 1 的元素之前处理
-
@aevitas,我不关心回报,我需要 Count 减少到 0。PS:对不起,我误解了 cbag 的工作原理,可能不好
标签: c# multithreading concurrency