2010-09-04 29 views
6

Trong WPF chúng ta có hai luồng (ít nhất): kết xuất và một chuỗi giao diện người dùng. Khi tôi nâng cao một sự kiện OnNotifyPropertyChanged trên một số thay đổi thuộc tính, nó được nâng lên trên chuỗi giao diện người dùng. Thông tin này cần phải được gửi đến WPF rendering thread để tái rendering. Tôi giả định nó được thực hiện một cách đồng bộ (Dispatcher.Invoke) nhưng làm thế nào nó thực sự làm việc?INotifyPropertyChanged: điều gì xảy ra phía sau hiện trường?

Nếu tôi tăng nhiều sự kiện OnNotifyPropertyChanged cho cùng một cấu trúc dữ liệu mà không khóa truy cập thuộc tính accessor cho cấu trúc dữ liệu này mà các sự kiện này đã được nêu ra, tôi có tạo ra điều kiện chạy tiềm năng không? Tôi đã nhìn thấy sự nổi tiếng "Bộ sưu tập đã được sửa đổi, hoạt động liệt kê có thể không thực hiện" ngoại lệ đến từ WPF, vì vậy có vẻ như WPF xử lý các sự kiện này một cách không đồng bộ. Tôi có hiểu lầm ngoại lệ không? Cảm ơn!

+0

Tại sao bạn không đăng mẫu để tạo lại mẫu này? Giống như hiển thị một vài bộ sưu tập mà bạn thường xuyên thay đổi từ một số sự kiện DispatcherTimer. –

Trả lời

0

Hope khi bạn đang đề cập hai chủ đề, bạn đang đề cập

  1. Rendering chủ đề
  2. UI Chủ đề.

Có bạn là đúng bản cập nhật là một asynch

Hãy xem http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

+0

Guru, ở đâu nó nói rằng WPF xử lý sự kiện NotifyPropertyChanged không đồng bộ? – Lenik

1

Trường hợp ngoại lệ "Bộ sưu tập đã được sửa đổi; hoạt động liệt kê có thể không thực hiện" không liên quan đến WPF, nó được nâng lên từ IEnumerator khi bạn lặp lại trên một bộ sưu tập với foreach và trong khi làm điều đó bộ sưu tập bằng cách nào đó thay đổi (thêm/xóa/sửa đổi). (ví dụ: http://social.msdn.microsoft.com/forums/en/netfxbcl/thread/7ce02724-2813-4f7d-8f3c-b1e3c1fd3019/) .

Ngoài việc tôi chưa bao giờ gặp ngoại lệ do nhiều lần đồng thời gọi trên sự kiện PropertyChanged.

+0

vấn đề là bộ sưu tập được WPF lặp lại chứ không phải bởi mã của tôi. Khi tôi bật ngoại lệ cơ hội đầu tiên, tôi thấy nó không thành công trong .NET – Lenik

+0

Loại trừ ngoại lệ là gì? –

+0

Đoán tốt nhất của tôi là nó đang xảy ra vì bạn sửa đổi bộ sưu tập trong khi tải của xaml. Các ràng buộc đang cố gắng để lặp lại trên bộ sưu tập để cư nó trên ItemsControl của bạn, và đồng thời bạn đang sửa đổi nó. Cố gắng đồng bộ hóa nó. – Captain

0

Bạn có đang tự xử lý bản thân của mình trên chuỗi không phải là giao diện người dùng không? Tôi khá chắc chắn rằng việc lặp lại của bất kỳ liệt kê nào bạn đang ràng buộc sẽ được thực hiện trên luồng giao diện người dùng, vì vậy nếu sau khi bạn nâng cao sự kiện người khác trong ứng dụng của bạn sửa đổi bộ sưu tập, bạn sẽ nhận được ngoại lệ này.

Sự cố không được gây ra bởi chuỗi hiển thị lặp lại trên bộ sưu tập của bạn vì nó không bao giờ làm điều đó.

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