以下代码来自此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语句,两者都有效吗? 如果奥姆用愚蠢的问题浪费你的时间,我真的很抱歉,但如果有人能够回答这个问题,那就是这个地方......
答案 0 :(得分:4)
为什么代码有两个返回状态,它有两个yield语句,两者都有效吗?
是。 yield return
将为要求“下一个”值的方法生成给定值...但是当再次要求 时,该方法将从之前的位置继续产生
您可能需要阅读my article on iterator blocks或MSDN page有关他们的信息。
答案 1 :(得分:3)
您可以阅读:
1)调用方法时,返回IEnumerator
2)第一次调用枚举器的Next
方法时,它将返回第一个yield return
3)以下时间调用Next
方法,它将“继续”执行此代码,并停止返回以下yield return
4)如果达到方法结束或达到yield break
,则表示枚举器已经遍历了所有元素。