2011-11-03 30 views
5

Tôi có một dự án wpf, nơi tôi đang sử dụng INotifyPropertyChanged trên một thuộc tính liên kết với hộp văn bản. Tôi đang cập nhật giá trị này trên một chủ đề khác bằng cách sử dụng tác vụ (TaskParallelLibrary). Nó được cập nhật đúng cách và KHÔNG ném một ngoại lệ. Tôi đã nghĩ rằng nó sẽ ném một ngoại lệ bởi vì nó đang chạy trên một sợi nền và không phải là chủ đề giao diện người dùng. Ofcourse nó là ném một ngoại lệ nếu tôi trực tiếp sử dụng các yếu tố giao diện người dùng. Vậy, cơ chế ràng buộc INotifyPropertyChanged có tự động gửi đến giao diện người dùng UI không?Thư viện tác vụ song song INotifyPropertyChanged KHÔNG ném một ngoại lệ?

Đây là mã của tôi với thuộc tính.

private string _textProperty = ""; 
    public string TextProperty 
    { 
     get 
     { 
      return _textProperty; 
     } 
     set 
     { 
      if (_textProperty != value) 
      { 
       _textProperty = value; 
       NotifyPropertyChanged("TextProperty"); 
      } 
     } 
    } 

và tạo nhiệm vụ của tôi là

var task = new Task(() => 
     { 
      TextProperty = "ABCD"; // Works. 
      // txtBox.Text = "ABCD"; // Throws an exception. 
     }); 
     task.Start(); 

và hộp văn bản trong XAML là <TextBox Name="txtBox" Text="{Binding TextProperty}"/>

Trả lời

6

Tôi đã nghĩ rằng nó sẽ ném một ngoại lệ vì nó đang chạy trên một chuỗi nền và không phải là chuỗi giao diện người dùng.

WPF cho phép bạn đặt giá trị giới hạn trên chuỗi nền. Nó sẽ xử lý marshaling đến thread UI cho bạn.

Lưu ý rằng, điều này có nghĩa là không hoạt động với các thành phần của bộ sưu tập. Nếu bạn muốn thêm vào một số ObservableCollection<T> bị ràng buộc, ví dụ, bạn sẽ phải sắp xếp lại luồng giao diện người dùng. Tuy nhiên, có various workarounds, điều này có thể giảm bớt nếu cần. Lưu ý rằng this behavior changes in WPF 4.5, điều này sẽ đơn giản hóa việc phát triển đa luồng trong WPF trong tương lai.

+1

+1. Liên kết thú vị với WPF 4.5. Có vẻ như họ đã sắp xếp một số thứ tôi không thích về WPF. – RichardOD

+0

@Reed nào bạn có một tham chiếu hữu ích cho cách wpf marshals cập nhật cho bạn? –

1

Ràng buộc để tính đơn không phải là thread affine. Bạn có thể làm điều này mà không có vấn đề, ràng buộc sẽ làm điều cần thiết cho bạn.
Tuy nhiên, hãy cẩn thận, điều này chỉ dành cho các ràng buộc thuộc tính duy nhất. Nếu bạn có ví dụ một ObservableCollection, bạn không thể thêm hoặc loại bỏ các mục từ một chủ đề khác, ngay cả khi bộ sưu tập được ràng buộc thông qua ràng buộc!

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