我有以下代码:
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捕获的。
有人可以解释发生了什么并给出解决方案吗?
答案 0 :(得分:6)
您的程序完全按照您的指示执行:如果Count > 0
,它会产生一个项目,否则产生零项目。
要返回项目,直到队列变空,请尝试:
while (_messageQueue.Count > 0)
答案 1 :(得分:1)
yield return
实际上暂停执行并执行假返回(它产生一个值),直到请求下一个。在这种情况下,您会检查计数是否>&gt; 0然后产生下一个值。当请求下一个if语句时,不会再次检查if语句,它会返回到yield return
之后的行,这是方法的结束,因此就完成了。
答案 2 :(得分:0)
“YIELD”的定义
在迭代器块中使用,为枚举器对象提供值或表示迭代结束。
我有一个很好的读取语法语句错误的记录,但我认为这意味着它必须在迭代器块中,而你写的那个不是。
也许将您的代码更改为;
foreeach (MessageQueItem item In GetNextQuedItem()
{
if (_messageQueue.Count > 0)
{
yield return _messageQueue.Dequeue();
} else {
yield break;
}
}