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.
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? –
@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. –