Saya tahu ini adalah pertanyaan lama, tetapi saya ingin menawarkan satu contoh bagaimana kata kunci hasil dapat digunakan secara kreatif. Saya benar - benar mendapat manfaat dari teknik ini. Semoga ini bisa menjadi bantuan bagi siapa pun yang menemukan pertanyaan ini.
Catatan: Jangan menganggap kata kunci hasil sebagai hanya cara lain untuk membangun koleksi. Sebagian besar dari kekuatan hasil datang dalam kenyataan bahwa eksekusi dijeda dalam metode atau properti Anda hingga kode panggilan beralih ke nilai berikutnya. Inilah contoh saya:
Dengan menggunakan kata kunci hasil (di samping implementasi coribine Coribine Caliburn.Micro karya Rob Eisenburg ) memungkinkan saya untuk mengekspresikan panggilan asinkron ke layanan web seperti ini:
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();
}
Apa yang akan dilakukan adalah mengaktifkan BusyIndicator saya, memanggil metode Login di layanan web saya, mengatur bendera IsLoggedIn saya ke nilai kembali, dan kemudian mematikan BusyIndicator kembali.
Begini cara kerjanya: IResult memiliki metode Execute dan acara Selesai. Caliburn.Micro mengambil IEnumerator dari panggilan ke HandleButtonClick () dan meneruskannya ke metode Coroutine.BeginExecute. Metode BeginExecute mulai iterasi melalui IResult. Ketika IResult pertama dikembalikan, eksekusi dijeda di dalam HandleButtonClick (), dan BeginExecute () melampirkan pengendali acara ke acara Selesai dan panggilan Execute (). IResult.Execute () dapat melakukan tugas sinkron atau asinkron dan menjalankan acara Selesai saat selesai.
LoginResult terlihat seperti ini:
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; }
}
Mungkin membantu untuk mengatur sesuatu seperti ini dan melangkah melalui eksekusi untuk menonton apa yang terjadi.
Semoga ini bisa membantu seseorang! Saya benar-benar menikmati menjelajahi berbagai cara menghasilkan yang dapat digunakan.
yield
terikatIEnumerable<T>
dan jenisnya. Ini dalam evaluasi malas entah bagaimana