2011-07-17 26 views
5

Tôi có giao diện người dùng rất phức tạp với thanh trạng thái thay đổi liên tục với nhiều loại thông báo trạng thái và giao diện người dùng có điều khiển biểu đồ phức tạp và bản đồ địa lý được chỉ định được tải.Cập nhật hàng loạt trên UI phức tạp

Giờ đây, bối cảnh dữ liệu của các khu vực nhỏ nhưng phức tạp này có các Chế độ xem phức tạp như StatusBarVM, ChartingVM, GeoMapVM vv ... Chúng triển khai INotifyPropertyChanged và ObservableCollections.

Tính cập nhật của tôi Tôi thấy rằng tôi có khoảng 5000 mục UI (lables, progressbars, điểm dữ liệu biểu đồ, bgcolorsbrushes, v.v.) đang thay đổi với tốc độ 1000 lần cập nhật mục dữ liệu mỗi giây.

Cách tốt nhất để đạt được bản cập nhật dữ liệu hàng loạt này trên giao diện người dùng WPF là gì?

Mô hình ràng buộc của WPF có khả năng cho các bản cập nhật lớn như vậy không? Nếu thế thì sao? Bởi vì tôi thấy nó không tối ưu trong trường hợp của tôi. Tôi đang sử dụng bgworker (cho progressbars) là tốt và sử dụng DIspatcher BeginInvoke ... nhưng điểm là ngay cả sau đó các bản cập nhật treo thread UI như các tin nhắn dispatcher đang nhận được xếp hàng chờ đợi để được hoàn thành.

Tôi không thể thực hiện ảo hóa vì trạng thái là thời gian thực và tôi phải xem tất cả trên giao diện người dùng trước mặt mình. Tôi không thể bỏ lỡ chúng ngay cả một vài giây (ví dụ: dữ liệu địa lý của vệ tinh khác nhau) .

Hãy giúp tôi xác định một công cụ chính xác hoặc một số cách để đạt được giao diện người dùng WPF phức tạp nhưng có tính phản hồi cao. Có phải Dispatcher.PushFrame() không?

Trả lời

4

Với nhiều cập nhật mỗi giây, bạn sẽ nhận được thông báo cập nhật "đã sao lưu" trong hàng đợi, đó là lý do tại sao cập nhật nhân viên nền của bạn bị chặn.

Để giải quyết vấn đề này, bạn cần điều chỉnh số lượng sự kiện cập nhật đang được ném.

Tôi muốn sử dụng một cách tiếp cận như thế này:

Trong ViewModels của tôi, thay thế việc thực hiện bình thường của INotifyPropertyChanged với một cuộc gọi đến một đối tượng singleton rằng sẽ gửi thông báo đại diện cho đối tượng đó.

private void OnPropertyChanged(string propertyName) 
{ 
    PropertyChangedNotifier.Notify(this, propertyName, propertyChanged); 
} 

Trường hợp propertyChanged là biến thành viên lưu bộ xử lý sự kiện đối tượng này.

Phương pháp Notify sẽ giống như thế này:

public static void Notify(
    object sender, 
    string propertyName, 
    PropertyChangedEventHandler handlers) 
{ ... } 

Trong notifier, không gửi sự kiện này ngay lập tức - chỉ cần lưu trữ thực tế là nó cần phải được gửi đi.

Nếu bạn nhận được thông báo nhiều lần cho cùng một đối tượng/thuộc tính, hãy hủy các thông báo bổ sung. Nếu bạn nhận được thông báo nhiều lần cho cùng một đối tượng nhưng các thuộc tính khác nhau, hãy thay thế thông báo bằng a single one for all properties.

Bây giờ, hãy sử dụng bộ đếm giờ UX để "giải phóng" các thông báo sau mỗi 50ms - vẫn đủ nhanh để người dùng không nhận thấy bất kỳ sự khác biệt nào và trông giống như cập nhật thời gian thực, nhưng đủ chậm để phát hiện (và xóa) thông báo trùng lặp.

+0

điều này trông giống như một triển khai tốt, mặc dù tôi phải hỏi là bản cập nhật giao diện người dùng dựa trên bộ đệm (theo sau cho các công nghệ giao diện người dùng khác như ASP.NET, WinForms, v.v.) giống như bạn đã thảo luận ở đây? –

+1

Tôi không chắc chắn, thuật ngữ "cập nhật giao diện người dùng dựa trên bộ đệm" không phải là cái tôi nhận ra. – Bevan

+1

Bạn nên cân nhắc sử dụng khung công tác này để cập nhật hàng loạt: [Reactive Extensions] (https://rx.codeplex.com/), xem phần bộ đệm theo thời gian. – Thomas

Các vấn đề liên quan