Tôi có hai lớp ViewModel: PersonViewModel và PersonSearchListViewModel. Một trong những trường thực hiện PersonViewModel là một ảnh hồ sơ được tải xuống thông qua WCF (được lưu trữ cục bộ trong bộ nhớ riêng). Lớp PersonSearchListViewModel là một lớp chứa chứa danh sách Người. Kể từ khi tải hình ảnh là tương đối nặng, PersonSearchListViewModel chỉ tải hình ảnh cho trang hiện tại, tiếp theo và trước đó (kết quả được phân trang trên giao diện người dùng) ... để cải thiện hơn nữa tải của hình ảnh tôi đặt tải hình ảnh trên một chủ đề khác. Tuy nhiên phương pháp tiếp cận đa luồng gây ra các vấn đề truy cập luồng chéo.Vấn đề truy cập chuỗi chéo không hợp lệ
PersonViewModel:
public void RetrieveProfileImage()
{
Image profileImage = MemorialDataModel.GetImagePerPerson(Person);
if (profileImage != null)
{
MemorialDataModel.ImageManager imgManager = new MemorialDataModel.ImageManager();
imgManager.GetBitmap(profileImage, LoadProfileBitmap);
}
}
private void LoadProfileBitmap(BitmapImage bi)
{
ProfileImage = bi;
// update
IsProfileImageLoaded = true;
}
private BitmapImage profileImage;
public BitmapImage ProfileImage
{
get
{
return profileImage;
}
set
{
profileImage = value;
RaisePropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("ProfileImage"));
}
}
PersonSearchListViewModel:
private void LoadImages()
{
// load new images
Thread loadImagesThread = new Thread(new ThreadStart(LoadImagesProcess));
loadImagesThread.Start();
//LoadImagesProcess(); If executed on the same thread everything works fine
}
private void LoadImagesProcess()
{
int skipRecords = (PageIndex * PageSize);
int returnRecords;
if (skipRecords != 0)
{
returnRecords = 3 * PageSize; // page before, cur page and next page
}
else
{
returnRecords = 2 * PageSize; // cur page and next page
}
var persons = this.persons.Skip(skipRecords).Take(returnRecords);
// load images
foreach (PersonViewModel pvm in persons)
{
if (!pvm.IsProfileImageLoaded)
{
pvm.RetrieveProfileImage();
}
}
}
Làm thế nào để bạn xử lý dữ liệu trong lớp ViewModel theo cách đa luồng? Tôi biết bạn phải sử dụng điều phối viên trên giao diện người dùng để cập nhật. Làm cách nào để cập nhật ViewModel bị ràng buộc với giao diện người dùng?
** CHỈNH SỬA **
Ngoài ra còn có một lỗi lạ khác xảy ra. Trong mã bên dưới:
public void GetBitmap(int imageID, Action<BitmapImage> callback)
{
// Get from server
bitmapCallback = callback;
memorialFileServiceClient.GetImageCompleted += new EventHandler<GetImageCompletedEventArgs>(OnGetBitmapHandler);
memorialFileServiceClient.GetImageAsync(imageID);
}
public void OnGetBitmapHandler(object sender, GetImageCompletedEventArgs imageArgs)
{
if (!imageArgs.Cancelled)
{
// I get cross-thread error right here
System.Windows.Media.Imaging.BitmapImage bi = new BitmapImage();
ConvertToBitmapFromBuffer(bi, imageArgs.Result.Image);
// call call back
bitmapCallback.Invoke(bi);
}
}
Tôi gặp phải lỗi chéo khi cố gắng tạo đối tượng BitmapImage mới trong chuỗi nền. Tại sao tôi không thể tạo một đối tượng BitmapImage mới trên một chủ đề nền?
Tuyệt vời, đó chính xác là những gì tôi đang tìm kiếm. Tôi đã đi với byte [] như là một phương tiện lưu trữ. – Ender
điều này cũng đã giúp tôi khi tôi đã phải nâng cao một sự kiện PropertyChanged cho nhiều thuộc tính sau khi một được thiết lập. –
Tôi không nhận ra một BitmapImage cần thiết được thực hiện trên chuỗi giao diện người dùng. Tôi thực sự nên nghĩ rằng vì DependencyProperty sẽ là một vấn đề khác. :: facepalm :: – Paul