C # yield return не возвращает товар, как ожидалось - PullRequest
2 голосов
/ 24 марта 2010

У меня есть следующий код:

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 ]

6 голосов
/ 24 марта 2010

Ваша программа делает именно то, что вы поручили: она выдает один элемент, если Count > 0 -, а в противном случае возвращает ноль элементов.

Чтобы вернуть элементы , пока очередь не станет пустой, попробуйте:

while (_messageQueue.Count > 0)
1 голос
/ 24 марта 2010

yield return фактически приостанавливает выполнение и возвращает ложный результат (возвращает значение) до следующего запроса. В этом случае, что происходит, вы проверяете, является ли счет> 0, а затем выводите следующее значение. Когда запрашивается следующий, ваш оператор if не проверяется снова, он возвращается к строке после yield return, которая является концом метода, и, таким образом, это делается.

0 голосов
/ 24 марта 2010

Определение «УРОЖАЯ»

Используется в блоке итератора для предоставления значения объекту перечислителя или для оповещения об окончании итерации.

У меня есть отличная запись о неправильном чтении синтаксических операторов, но я думаю, это означает, что он должен быть в блоке итератора, а тот, который вы написали, - нет.

Возможно, измените код на;

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...