So che questa è una vecchia domanda, ma vorrei offrire un esempio di come la parola chiave yield può essere utilizzata in modo creativo. Ho davvero beneficiato di questa tecnica. Spero che questo possa essere d'aiuto a chiunque altro inciampi su questa domanda.
Nota: non pensare alla parola chiave yield semplicemente come un altro modo per creare una raccolta. Una grande parte del potere del rendimento deriva dal fatto che l'esecuzione è messa in pausa nel metodo o nella proprietà fino a quando il codice chiamante non scorre sul valore successivo. Ecco il mio esempio:
L'uso della parola chiave yield (insieme all'implementazione delle coroutine Caliburn.Micro di Rob Eisenburg ) mi permette di esprimere una chiamata asincrona a un servizio web come questo:
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();
}
Quello che farà è accendere il mio BusyIndicator, chiamare il metodo Login sul mio servizio web, impostare il mio flag IsLoggedIn sul valore di ritorno, quindi disattivare nuovamente BusyIndicator.
Ecco come funziona: IResult ha un metodo Execute e un evento Completato. Caliburn.Micro prende l'IEnumerator dalla chiamata a HandleButtonClick () e lo passa in un metodo Coroutine.BeginExecute. Il metodo BeginExecute avvia l'iterazione tramite IResults. Quando viene restituito il primo IResult, l'esecuzione viene messa in pausa all'interno di HandleButtonClick () e BeginExecute () collega un gestore eventi all'evento Completato e chiama Execute (). IResult.Execute () può eseguire un'attività sincrona o asincrona e, al termine, genera l'evento Completato.
LoginResult è simile al seguente:
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; }
}
Può essere utile impostare qualcosa del genere e seguire l'esecuzione per vedere cosa sta succedendo.
Spero che questo aiuti qualcuno! Mi è piaciuto molto esplorare i diversi modi in cui è possibile utilizzare la resa.
yield
è legato alIEnumerable<T>
suo genere. È in qualche modo una valutazione pigra