C#yield返回未按预期返回项目

时间:2010-03-23 22:51:46

标签: c# yield

我有以下代码:

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捕获的。

有人可以解释发生了什么并给出解决方案吗?

3 个答案:

答案 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;
     }

}