ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันต้องการนำเสนอตัวอย่างหนึ่งของการใช้คำหลักที่ให้ผลตอบแทนอย่างสร้างสรรค์ ฉันได้จริงๆได้รับประโยชน์จากเทคนิคนี้ หวังว่านี่จะเป็นประโยชน์สำหรับใครก็ตามที่สะดุดกับคำถามนี้
หมายเหตุ: อย่าคิดว่าคำหลักผลตอบแทนเป็นเพียงอีกวิธีหนึ่งในการสร้างคอลเลกชัน ส่วนใหญ่ของพลังของผลตอบแทนมาในความจริงที่ว่าการดำเนินการถูกหยุดในวิธีการหรือคุณสมบัติของคุณจนกว่ารหัสโทรซ้ำ iterates มากกว่าค่าถัดไป นี่คือตัวอย่างของฉัน:
การใช้คำหลักที่อัตราผลตอบแทน (ใกล้ร็อบ Eisenburg ของCaliburn.Micro coroutinesการดำเนินงาน) ช่วยให้ฉันเพื่อแสดงความไม่ตรงกันโทรไปยังบริการเว็บเช่นนี้
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 มีวิธีการดำเนินการและเหตุการณ์ที่เสร็จสมบูรณ์ 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>
ชนิดของมัน มันอยู่ในการประเมินผลที่ขี้เกียจ