Я не понимаю этот код из MSDN

Следующий код взят из этой статьи MSDN ссылка, чего я не знаю. понять, находится в Приложении B, вплоть до статьи.

private IEnumerator<ITask> OnStartup()
{
    rst4.ServiceTutorial4State state = null;

    yield return Arbiter.Choice(
        _clockPort.Get(GetRequestType.Instance),
        delegate(rst4.ServiceTutorial4State response)
        {
            state = response;
        },
        delegate(Fault fault)
        {
            LogError(null, "Unable to Get state from ServiceTutorial4", fault);
        }
    );

    if (state != null)
    {
        ServiceTutorial6State initState = new ServiceTutorial6State();
        initState.InitialTicks = state.Ticks;

        PartnerType partner = FindPartner("Clock");
        if (partner != null)
        {
            initState.Clock = partner.Service;
        }

        Replace replace = new Replace();
        replace.Body = initState;

        _mainPort.Post(replace);
    }

    yield return Arbiter.Choice(
        _clockPort.Subscribe(_clockNotify),
        delegate(SubscribeResponseType response) { },
        delegate(Fault fault)
        {
            LogError(null, "Unable to subscribe to ServiceTutorial4", fault);
        }
    );
}

Почему в коде два состояния возврата, два оператора yield, оба будут работать? Мне искренне жаль, если О тратит ваше время на глупые вопросы, но если кто-то может ответить на вопрос, это место...


person schultz    schedule 15.11.2013    source источник


Ответы (2)


Вы можете читать как:

1) При вызове метода возвращается IEnumerator

2) При первом вызове метода Next перечислителя он вернет результат первого yield return

3) В следующий раз, когда вызывается метод Next, он «продолжит» выполнение этого кода с того места, где он был остановлен, и остановится, чтобы вернуть следующее yield return

4) Если достигнут конец метода или достигнуто yield break, это будет означать, что перечислитель перебрал все элементы.

person SJuan76    schedule 15.11.2013

Почему в коде два состояния возврата, два оператора yield, оба будут работать?

да. yield return передаст заданное значение методу, который запрашивает "следующее" значение... но когда следующее значение запрашивается снова, метод продолжит работу с того места, где он ранее выдавался.

Вы можете прочитать мою статью о блоках итераторов или страница MSDN о них.

person Jon Skeet    schedule 15.11.2013