Đôi khi người dùng bắt đầu một hoạt động kỹ thuật mở rộng phải mất một thời gian để thực hiện. Trong những trường hợp này, thường là tốt để hiển thị một số loại thanh tiến trình, cùng với thông tin về nhiệm vụ nào đang được thực hiện ngay bây giờ.
Để tránh kết hợp chặt chẽ giữa UI và các lớp logic, thông thường tốt nhất là có giao tiếp xảy ra thông qua một số loại proxy. Đó là, back-end không nên thao túng các thành phần UI của chính nó, hoặc thậm chí tương tác trực tiếp với lớp trung gian.
Rõ ràng, phải có một số cuộc gọi lại ở đâu đó để thực hiện công việc này. Tôi thường thực hiện nó theo một trong hai cách:
Truyền một đối tượng có thể thay đổi vào back-end và để back-end thực hiện các thay đổi đối với tiến trình đó. Đối tượng thông báo cho giao diện người dùng khi có thay đổi.
Vượt qua chức năng gọi lại của biểu mẫu
void f(ProgressObject)
hoặcProgressObject -> unit
yêu cầu back-end. Trong trường hợp này, back-end xây dựngProgressObject
và nó hoàn toàn thụ động. Nó phải xây dựng một đối tượng mới mỗi lần nó muốn báo cáo tiến độ, tôi giả sử.
Hạn chế và ưu điểm của các phương pháp này là gì? Có một phương pháp tốt nhất để sử dụng? Có những trường hợp khác nhau cho việc sử dụng của họ?
Có các kỹ thuật báo cáo tiến độ hoàn toàn khác nhau mà tôi đã bỏ qua không?
BackgroundWorker
đề cập đó. Được bao bọc trong một lớp tùy chỉnh cùng với "biểu mẫu tiến trình", v.v. và một cơ chế đơn giản để truyền đạt một ngoại lệ - như BackgroundWorker
thiết kế chạy trong một luồng riêng biệt. Trong phạm vi chúng tôi sử dụng các tính năng của nó theo cách được đề xuất bởi .Net thì có thể nói đó là thành ngữ. Và trong bất kỳ bối cảnh ngôn ngữ / khung cụ thể nào, "thành ngữ" có thể là tốt nhất.