Sé que esta es una vieja pregunta, pero me gustaría ofrecer un ejemplo de cómo la palabra clave de rendimiento se puede usar de manera creativa. Realmente me he beneficiado de esta técnica. Esperemos que esto sea de ayuda para cualquier otra persona que se encuentre con esta pregunta.
Nota: No piense en la palabra clave de rendimiento como simplemente otra forma de crear una colección. Una gran parte del poder del rendimiento viene del hecho de que la ejecución se detiene en su método o propiedad hasta que el código de llamada itera sobre el siguiente valor. Aquí está mi ejemplo:
El uso de la palabra clave de rendimiento (junto con la implementación de las rutinas Caliburn.Micro de Rob Eisenburg ) me permite expresar una llamada asincrónica a un servicio 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();
}
Lo que esto hará es encender mi BusyIndicator, llamar al método de inicio de sesión en mi servicio web, establecer mi indicador IsLoggedIn en el valor de retorno y luego volver a apagar el BusyIndicator.
Así es como funciona: IResult tiene un método de ejecución y un evento completado. Caliburn.Micro toma el IEnumerator de la llamada a HandleButtonClick () y lo pasa a un método Coroutine.BeginExecute. El método BeginExecute comienza a iterar a través de los IResults. Cuando se devuelve el primer IResult, la ejecución se detiene dentro de HandleButtonClick (), y BeginExecute () adjunta un controlador de eventos al evento Completed y llama a Execute (). IResult.Execute () puede realizar una tarea sincrónica o asincrónica y dispara el evento Completed cuando se realiza.
LoginResult se parece a esto:
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; }
}
Puede ser útil configurar algo como esto y pasar por la ejecución para ver lo que está sucediendo.
¡Espero que esto ayude a alguien! Realmente disfruté explorando las diferentes formas en que se puede usar el rendimiento.
yield
está atadoIEnumerable<T>
y es amable. De alguna manera es una evaluación perezosa