2010-09-02 36 views
6

Tôi đang thu thập dữ liệu trong một Tác vụ riêng biệt và tôi muốn dữ liệu ràng buộc kết quả với một thành phần GUI bằng cách sử dụng một ObservableCollection<>. Vì vậy, mã của tôi có dạng như sau:Làm thế nào để xử lý kết quả ObservableCollection <> từ một tác vụ song song trong MVVM?

private ObservableCollection<MyItem> _items; 
public ObservableCollection<MyItem> Items 
{ 
    get { return _items; } 
    set 
    { 
    if (_items.Equals(value)) 
    { 
     return; 
    } 
    _items = value; 
    RaisePropertyChanged("Items"); 
    } 
} 

private void LoadData() 
{ 
    Task task = Task.Factory.StartNew(() => 
    { 
    ObservableCollection<MyItem> itms = _htmlParser.FetchData(...); 

    Dispatcher.CurrentDispatcher.Invoke((Action)delegate 
    { 
     Items = itms; 
    }); 
    }); 
} 

Dữ liệu được lấy từ một thành phần đang thực hiện một số yêu cầu HTTP. Lỗi tôi nhận được là:
Must create DependencySource on same Thread as the DependencyObject.

Tôi đang sử dụng khung công cụ Bộ công cụ ánh sáng MVVM. Tôi cũng đã cố gắng gửi kết quả dưới dạng tin nhắn, nhưng điều đó đã kết thúc trong cùng một thông báo lỗi. Bất kỳ ý tưởng hoặc con trỏ?

EDIT: Đây là vấn đề:

public class MyItem 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public BitmapImage Image { get; set; } // <--- A big No No because it inherits from the DependencyObject 
    public Uri Uri { get; set; } 
} 

Tôi đã thay đổi BitmapImage đến một loại byte[] dữ liệu.

+0

Nếu nhiệm vụ của bạn được cho là đang xảy ra ở chế độ nền để nó không khóa giao diện người dùng, điều đầu tiên bạn làm là Gọi lại luồng giao diện người dùng - điều này sẽ không chặn tất cả đầu vào giao diện người dùng trong khi _htmlParser đang tìm nạp dữ liệu? –

+0

@Martin, bạn đang nâng cao một điểm rất tốt. Khi tôi đặt câu hỏi với nhau, tôi nhanh chóng đơn giản hóa mã. Bây giờ tôi đã cập nhật câu hỏi với luồng mã tốt hơn. –

Trả lời

1

Trường hợp ngoại lệ bạn đang nhận được ("Phải tạo DependencySource trên cùng một chủ đề như DependencyObject") chỉ ra rằng một cái gì đó đang được tạo ra trên một sợi nền và được sử dụng trên chuỗi giao diện người dùng. Có bất kỳ điều khiển giao diện người dùng nào được tạo và lưu trữ trong bộ sưu tập để sử dụng bởi giao diện người dùng không?

Tôi thấy rằng chính ObservableCollection đang được tạo trên một chuỗi nền, nhưng tôi không nghĩ đó là vấn đề - rất tiếc là tôi không ở trong văn phòng để mã hóa và xác nhận điều đó.

+0

Chính xác. Trong lớp MyItem của tôi, tôi đã có một thuộc tính BitmapImage, mà cuối cùng được kế thừa từ lớp DependencyObject. Thay đổi điều đó thành kiểu dữ liệu byte [] thay vì cố định vấn đề. –

4

Bạn có thể thử để thay thế Dispatcher.CurrentDispatcher vào Application.Current.Dispatcher không chắc chắn về mặc dù điều này

+0

Vâng, tôi sẽ bị darned. Không nhận ra sự khác biệt. Cảm ơn. –

+0

Vui mừng được giúp đỡ –

+0

Sau khi thay đổi mã thành mẫu Gọi tốt hơn nhiều (xem cập nhật), đề xuất của bạn không hoạt động được nữa. –

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