我不明白MSDN的这段代码

时间:2013-11-15 22:17:37

标签: c# msdn yield

以下代码来自此MSDN文章a link,我不明白的内容在附录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语句,两者都有效吗? 如果奥姆用愚蠢的问题浪费你的时间,我真的很抱歉,但如果有人能够回答这个问题,那就是这个地方......

2 个答案:

答案 0 :(得分:4)

  

为什么代码有两个返回状态,它有两个yield语句,两者都有效吗?

是。 yield return将为要求“下一个”值的方法生成给定值...但是当再次要求 时,该方法将从之前的位置继续产生

您可能需要阅读my article on iterator blocksMSDN page有关他们的信息。

答案 1 :(得分:3)

您可以阅读:

1)调用方法时,返回IEnumerator

2)第一次调用枚举器的Next方法时,它将返回第一个yield return

的结果

3)以下时间调用Next方法,它将“继续”执行此代码,并停止返回以下yield return

4)如果达到方法结束或达到yield break,则表示枚举器已经遍历了所有元素。