Я знаю, що це давнє запитання, але я хочу запропонувати один приклад того, як ключове слово дохід можна творчо використовувати. Я справді отримав користь від цієї техніки. Сподіваємось, це допоможе всім, хто натрапить на це питання.
Примітка. Не думайте про ключове слово "урожайність" як про ще один спосіб створення колекції. Велика частина потужності прибутковості полягає в тому, що виконання призупинено у вашому методі чи властивості, поки викликовий код не повториться над наступним значенням. Ось мій приклад:
Використання ключового слова прибутковості (поряд із впровадженням процедур Roli Eisenburg Caliburn.Micro ) дозволяє мені висловити асинхронний виклик веб-сервісу на зразок цього:
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();
}
Для цього потрібно ввімкнути мій BusyIndicator, зателефонувати за методом входу на веб-службі, встановити прапор IsLoggedIn на значення повернення, а потім відключити BusyIndicator.
Ось як це працює: IResult має метод Execute та подія завершено. Caliburn.Micro захоплює IEnumerator з виклику HandleButtonClick () і передає його методу Coroutine.BeginExecute. Метод BeginExecute починає ітерацію через IResults. Після повернення першого IResult виконання призупиняється всередині HandleButtonClick (), а BeginExecute () додає обробник подій до події завершено і викликає Execute (). IResult.Execute () може виконувати або синхронну, або асинхронну задачу, і запускає подія завершено, коли це зроблено.
LoginResult виглядає приблизно так:
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; }
}
Це може допомогти налаштувати щось подібне і пройти через виконання, щоб подивитися, що відбувається.
Сподіваюся, це допоможе комусь вийти! Мені дуже подобалося вивчати різні способи використання врожаю.
yield
прив’язаний доIEnumerable<T>
і його виду. Це дещо ледача оцінка