499
Chương 12: Dịch vụ Web XML và Remoting
return null;
}
}
[Serializable()]
public class TaskCompleteEventArgs : EventArgs {
public string Result;
public TaskCompleteEventArgs(string result) {
this.Result = result;
}
}
Bước kế tiếp là định nghĩa một lớp khả-truy-xuất-từ-xa chạy trên client và có thể nhận sự kiện
này. Theo đó, lớp này có thể tiếp xúc với client. Lớp
EventListener
dưới đây trình bày một ví
dụ như thế—nó chỉ đơn giản dựng lên sự kiện thứ hai, mà client có thể trực tiếp xử lý. Cũng
như tất cả các đối tượng khả-truy-xuất-từ-xa, nó sẽ chỉ được truy xuất trong 5 phút, trừ khi
bạn thay đổi chính sách “lease” (sẽ được mô tả trong mục 12.11). Có một cách là chép đè
phương thức
InitializeLifetimeService
để cho phép đối tượng được sống vĩnh viễn:
public class EventListener : MarshalByRefObject {
public event RemoteObject.TaskCompleted TaskComplete;
// Thụ lý sự kiện ở xa.
public void OnTaskComplete(object sender,
RemoteObject.TaskCompleteEventArgs e) {
TaskComplete(sender, e);
}
public override object InitializeLifetimeService() {
return null;
}
}
Listener phải được định nghĩa trong một assembly riêng để nó có thể được tham chiếu bởi ứng
dụng client và lớp khả-truy-xuất-từ-xa (cả hai đều cần tương tác với nó).
Bây giờ ứng dụng client có thể khởi chạy tác vụ bất đồng bộ thông qua lớp
RemoteObject
và
thụ lý sự kiện thông qua lớp
EventListener
. Đoạn mã dưới đây trình bày một client chỉ đơn
giản hiển thị thông báo khi nhận được sự kiện: