Nieprawidłowy problem z dostępem między wątkami

Mam dwie klasy ViewModel: PersonViewModel i PersonSearchListViewModel. Jednym z pól implementacji PersonViewModel jest obraz profilu, który jest pobierany przez WCF (buforowany lokalnie w odizolowanej pamięci). PersonSearchListViewModel to klasa kontenerów, która zawiera listę osób. Ponieważ ładowanie obrazów jest stosunkowo ciężkie, PersonSearchListViewModel ładuje tylko obrazy dla bieżącej, następnej i poprzedniej strony (wyniki są wyświetlane na interfejsie użytkownika) ... aby jeszcze bardziej zwiększyć obciążenie obrazów, ładuję obrazy na inny wątek. Jednak podejście wielowątkowe powoduje problemy z dostępem między wątkami.

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();
        }
    }
}

Jak przetwarzać dane w klasie ViewModel w sposób wielowątkowy? Wiem, że musisz użyć dyspozytora w interfejsie użytkownika, aby zaktualizować. Jak zaktualizować ViewModel powiązany z interfejsem użytkownika?

** EDYTOWAĆ **

Występuje jeszcze jeden dziwny błąd. W poniższym kodzie:

        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);
            }
        }

Podczas próby utworzenia nowego obiektu BitmapImage w wątku w tle pojawia się błąd między wątkami. Dlaczego nie mogę utworzyć nowego obiektu BitmapImage na wątku w tle?

questionAnswers(3)

yourAnswerToTheQuestion