Bunun eski bir soru olduğunu biliyorum, ancak verim anahtar kelimesinin yaratıcı bir şekilde nasıl kullanılabileceğine dair bir örnek sunmak istiyorum. Ben var gerçekten bu tekniğin yararlanmıştır. Umarım bu, bu soruyu tökezleyen herkese yardımcı olacaktır.
Not: Ürün anahtar kelimesini yalnızca koleksiyon oluşturmanın başka bir yolu olarak düşünmeyin. Verim gücünün büyük bir kısmı , çağıran kod bir sonraki değer üzerinde yinelenene kadar, yönteminizde veya mülkünüzde yürütmenin duraklatılmış olmasından kaynaklanır . İşte benim örnek:
Verim anahtar sözcüğünü (Rob Eisenburg'un Caliburn.Micro coroutines uygulamasının yanında) kullanmak, şöyle bir web hizmetine eşzamansız bir çağrı ifade etmeme izin verir:
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();
}
Bunun yapacağı şey BusyIndicator'ımı açmak, web hizmetimdeki Login yöntemini çağırmak, IsLoggedIn bayrağımı dönüş değerine ayarlamak ve sonra BusyIndicator'ı tekrar kapatmak.
İşte böyle çalışır: IResult bir Execute yöntemi ve bir Completed olayı vardır. Caliburn.Micro, IEnumerator öğesini HandleButtonClick () çağrısından alır ve bir Coroutine.BeginExecute yöntemine iletir. BeginExecute yöntemi, IResults aracılığıyla yinelemeyi başlatır. İlk IResult döndürüldüğünde, işlem HandleButtonClick () içinde duraklatılır ve BeginExecute (), Completed olayına bir olay işleyicisi ekler ve Execute () öğesini çağırır. IResult.Execute (), eşzamanlı veya eşzamansız bir görevi gerçekleştirebilir ve tamamlandığında Tamamlandı olayını tetikler.
LoginResult şöyle görünür:
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; }
}
Böyle bir şey ayarlamak ve neler olup bittiğini izlemek için yürütme adımlarını atmak yardımcı olabilir.
Umarım bu birisine yardım eder! Verimin kullanılabileceği farklı yolları keşfetmekten gerçekten keyif aldım.
yield
bağlıdırIEnumerable<T>
ve onun tür. Bir şekilde tembel değerlendirmede