2013-11-15 2 views
1

Следующий код из этой статьи MSDN a link, что я не понимаю, содержится в Приложении B, вплоть до конца в статье.Я не понимаю этот код из MSDN

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); 
     } 
    ); 
} 

Почему код имеет два состояния возврата, Он имеет два оператора вывода, будут ли работать оба? Я действительно сожалею, если O'M тратить время на глупые вопросы, но если кто-то сможет ответить на вопрос, что это место ...

ответ

3

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

1) Когда вызывается метод, IEnumerator возвращается

2) В первый раз Next метод счетчику называется, он будет возвращать результат из первый yield return

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

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

4

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

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

Возможно, вы захотите прочитать my article on iterator blocks или MSDN page о них.

+0

Я действительно прочитаю вашу статью. – schultz

Смежные вопросы