Tôi biết đây là một câu hỏi cũ, nhưng tôi muốn đưa ra một ví dụ về cách từ khóa năng suất có thể được sử dụng một cách sáng tạo. Tôi thực sự có hưởng lợi từ kỹ thuật này. Hy vọng rằng điều này sẽ giúp ích cho bất cứ ai khác vấp phải câu hỏi này.
Lưu ý: Đừng nghĩ về từ khóa năng suất chỉ là một cách khác để xây dựng bộ sưu tập. Một phần lớn sức mạnh của năng suất đến trong thực tế là việc thực thi bị tạm dừng trong phương thức hoặc thuộc tính của bạn cho đến khi mã gọi lặp lại giá trị tiếp theo. Đây là ví dụ của tôi:
Sử dụng từ khóa suất (cùng với triển khai Caliburn.Micro coroutines của Rob Eisenburg ) cho phép tôi thể hiện một cuộc gọi không đồng bộ đến một dịch vụ web như thế này:
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();
}
Điều này sẽ làm là bật BusyIndicator của tôi, gọi phương thức Đăng nhập trên dịch vụ web của tôi, đặt cờ IsLoggedIn của tôi thành giá trị trả về, sau đó tắt BusyIndicator.
Đây là cách thức hoạt động: IResult có phương thức Thực thi và sự kiện Đã hoàn thành. Caliburn.Micro lấy IEnumerator từ lệnh gọi đến HandButtonClick () và chuyển nó vào một phương thức Coroutine.BeginExecute. Phương thức BeginExecute bắt đầu lặp qua IResults. Khi IResult đầu tiên được trả về, việc thực thi bị tạm dừng bên trong HandButtonClick () và BeginExecute () đính kèm một trình xử lý sự kiện vào sự kiện đã hoàn thành và gọi Execute (). IResult.Execute () có thể thực hiện tác vụ đồng bộ hoặc không đồng bộ và kích hoạt sự kiện Đã hoàn thành khi hoàn thành.
LoginResult trông giống như thế này:
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; }
}
Nó có thể giúp thiết lập một cái gì đó như thế này và từng bước thực hiện để xem những gì đang diễn ra.
Mong rằng nó giúp ai đó thoát! Tôi thực sự rất thích khám phá những cách khác nhau có thể sử dụng năng suất.
yield
được gắn vớiIEnumerable<T>
và loại của nó. Đó là trong một đánh giá lười biếng nào đó