Problema de acceso a subprocesos no válido

Tengo dos clases de ViewModel: PersonViewModel y PersonSearchListViewModel. Uno de los campos que implementa PersonViewModel es una imagen de perfil que se descarga a través de WCF (en caché local en almacenamiento aislado). El PersonSearchListViewModel es una clase contenedora que contiene una lista de Personas. Como la carga de imágenes es relativamente pesada, PersonSearchListViewModel carga solo las imágenes de la página actual, la siguiente y la anterior (los resultados están paginados en la interfaz de usuario) ... para mejorar aún más la carga de imágenes, puse la carga de imágenes en otro hilo. Sin embargo, el enfoque de subprocesos múltiples causa problemas de acceso entre subprocesos.

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

¿Cómo procesa los datos en la clase ViewModel de manera multiproceso? Sé que tienes que usar dispatcher en la interfaz de usuario para actualizar. ¿Cómo actualizar ViewModel que está vinculado a la interfaz de usuario?

** EDIT **

También hay un error más extraño que sucede. En el siguiente código:

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

Recibo un error de enlace cruzado cuando intento crear un nuevo objeto BitmapImage en el hilo de fondo. ¿Por qué no puedo crear un nuevo objeto BitmapImage en un hilo de fondo?

Respuestas a la pregunta(3)

Su respuesta a la pregunta