Wiem, że to stare pytanie, ale chciałbym podać jeden przykład, w jaki sposób można twórczo wykorzystać słowo kluczowe wydajności. I rzeczywiście skorzystało z tej techniki. Mam nadzieję, że będzie to pomocne dla każdego, kto natknie się na to pytanie.
Uwaga: nie myśl o słowu kluczowym wydajności jako o innym sposobie budowania kolekcji. Duża część siły dochodu polega na tym, że wykonanie jest wstrzymane w metodzie lub właściwości, dopóki kod wywołujący nie przejdzie do następnej wartości. Oto mój przykład:
Użycie słowa kluczowego fed (wraz z implementacją Caliburn.Micro Coroutines Roba Eisenburga ) pozwala mi wyrazić asynchroniczne wywołanie usługi internetowej:
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();
}
Spowoduje to włączenie mojego BusyIndicator, wywołanie metody Login w mojej usłudze internetowej, ustawienie flagi IsLoggedIn na wartość zwracaną, a następnie wyłączenie BusyIndicator.
Oto jak to działa: IResult ma metodę wykonania i zdarzenie zakończone. Caliburn.Micro pobiera IEnumerator z wywołania HandleButtonClick () i przekazuje go do metody Coroutine.BeginExecute. Metoda BeginExecute rozpoczyna iterację poprzez IResults. Kiedy zwracany jest pierwszy IResult, wykonywanie jest wstrzymywane w HandleButtonClick (), a BeginExecute () dołącza moduł obsługi zdarzenia do zdarzenia Completed i wywołuje Execute (). IResult.Execute () może wykonać zadanie synchroniczne lub asynchroniczne i po zakończeniu uruchamia zdarzenie Completed.
LoginResult wygląda mniej więcej tak:
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; }
}
Może pomóc skonfigurować coś takiego i przejść przez wykonanie, aby zobaczyć, co się dzieje.
Mam nadzieję, że to komuś pomoże! Naprawdę podobało mi się odkrywanie różnych sposobów wykorzystania plonu.
yield
jest przywiązanyIEnumerable<T>
i tego rodzaju. Jest to w jakiś sposób leniwa ocena