Sei que essa é uma pergunta antiga, mas gostaria de oferecer um exemplo de como a palavra-chave yield pode ser usada de forma criativa. Eu realmente me beneficiei dessa técnica. Espero que isso ajude qualquer pessoa que tropeça nessa questão.
Nota: Não pense na palavra-chave yield como sendo apenas outra maneira de criar uma coleção. Uma grande parte do poder do rendimento vem do fato de a execução ser pausada em seu método ou propriedade até que o código de chamada itere sobre o próximo valor. Aqui está o meu exemplo:
O uso da palavra-chave yield (ao lado da implementação Caliburn.Micro coroutines de Rob Eisenburg ) permite expressar uma chamada assíncrona para um serviço da Web como este:
public IEnumerable<IResult> HandleButtonClick() {
yield return Show.Busy();
var loginCall = new LoginResult(wsClient, Username, Password);
yield return loginCall;
this.IsLoggedIn = loginCall.Success;
yield return Show.NotBusy();
}
O que isso fará é ativar meu BusyIndicator, chamar o método Login no meu serviço da web, definir meu sinalizador IsLoggedIn com o valor de retorno e desativar o BusyIndicator.
Eis como isso funciona: IResult possui um método Execute e um evento Completed. Caliburn.Micro pega o IEnumerator da chamada para HandleButtonClick () e o passa para um método Coroutine.BeginExecute. O método BeginExecute começa a iterar pelos IResults. Quando o primeiro IResult é retornado, a execução é pausada dentro de HandleButtonClick () e BeginExecute () anexa um manipulador de eventos ao evento Completed e chama Execute (). IResult.Execute () pode executar uma tarefa síncrona ou assíncrona e dispara o evento Concluído quando terminar.
O LoginResult é mais ou menos assim:
public LoginResult : IResult {
// Constructor to set private members...
public void Execute(ActionExecutionContext context) {
wsClient.LoginCompleted += (sender, e) => {
this.Success = e.Result;
Completed(this, new ResultCompletionEventArgs());
};
wsClient.Login(username, password);
}
public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };
public bool Success { get; private set; }
}
Pode ajudar a configurar algo assim e avançar na execução para observar o que está acontecendo.
Espero que isso ajude alguém! Eu realmente gostei de explorar as diferentes maneiras pelas quais o rendimento pode ser usado.
yield
está ligado aIEnumerable<T>
e seu tipo. É de alguma maneira avaliação preguiçosa