【发布时间】:2010-03-23 22:51:45
【问题描述】:
我有以下代码:
private void ProcessQueue()
{
foreach (MessageQueueItem item in GetNextQueuedItem())
PerformAction(item);
}
private IEnumerable<MessageQueueItem> GetNextQueuedItem()
{
if (_messageQueue.Count > 0)
yield return _messageQueue.Dequeue();
}
在调用 ProcessQueue 时,队列中最初只有一项。 在 PerformAction 期间,我会向 _messageQueue 添加更多项目。但是,foreach 循环在初始项之后退出,并且看不到添加的后续项。
我感觉队列的初始状态不知何故被 yield 捕获了。
有人可以解释发生了什么并给出解决方案吗?
【问题讨论】:
-
如果只在 ProcessQueue 中使用 while 循环而不是使用枚举器,代码会更简单。枚举器非常方便,但对于简单的循环处理来说,它们可能是多余的。
-
好评论 - 虽然我通过一系列重构来到了上面,我只是陷入了好奇的追逐中。