Ungültiges Cross-Thread-Zugriffsproblem

Ich habe zwei ViewModel-Klassen: PersonViewModel und PersonSearchListViewModel. Eines der Felder, die PersonViewModel implementiert, ist ein Profilbild, das über WCF heruntergeladen wird (lokal im isolierten Speicher zwischengespeichert). Das PersonSearchListViewModel ist eine Containerklasse, die eine Liste von Personen enthält. Da das Laden von Bildern relativ umfangreich ist, lädt PersonSearchListViewModel nur Bilder für die aktuelle, nächste und vorherige Seite (Ergebnisse werden auf der Benutzeroberfläche angezeigt). Um das Laden von Bildern weiter zu verbessern, habe ich das Laden von Bildern in einen anderen Thread verschoben. Der Multithreading-Ansatz führt jedoch zu Problemen beim Zugriff über mehrere Threads.

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

Wie verarbeitet man Daten in der ViewModel-Klasse auf Multithread-Weise? Ich weiß, dass Sie den Dispatcher auf der Benutzeroberfläche verwenden müssen, um ein Update durchzuführen. Wie aktualisiere ich ViewModel, das an die Benutzeroberfläche gebunden ist?

** EDIT **

Es gibt noch einen weiteren seltsamen Fehler. Im Code unten:

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

Beim Versuch, ein neues BitmapImage-Objekt im Hintergrundthread zu erstellen, wird ein Thread-übergreifender Fehler angezeigt. Warum kann ich in einem Hintergrundthread kein neues BitmapImage-Objekt erstellen?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage