2

我有以下代码:

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 循环在初始项之后退出,并且看不到添加的后续项。

我感觉到队列的初始状态以某种方式被产量捕获。

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

4

3 回答 3

6

您的程序完全按照您的指示执行:如果Count > 0- 则生成一项,否则生成零项。

要在队列变空之前返回项目,请尝试:

while (_messageQueue.Count > 0)
于 2010-03-23T22:53:47.103 回答
1

yield return实际上暂停执行并进行假返回(它产生一个值),直到请求下一个。在这种情况下,您会检查计数是否 > 0,然后产生下一个值。当请求下一个时,您的 if 语句不再检查,它返回到yield return方法结束之后的行,因此它完成了。

于 2010-03-23T23:00:28.293 回答
0

“产量”的定义

在迭代器块中用于为枚举器对象提供值或发出迭代结束的信号。

我有一个很好的错误阅读语法语句的记录,但我认为这意味着它必须在一个迭代器块中,而你写的不是。

也许将您的代码更改为;

foreeach (MessageQueItem item In GetNextQuedItem()
{
     if (_messageQueue.Count > 0)
     {   
         yield return _messageQueue.Dequeue();
     } else { 
         yield break;
     }

}
于 2010-03-23T23:09:25.543 回答