Problema de acesso cruzado inválido

Eu tenho duas classes ViewModel: PersonViewModel e PersonSearchListViewModel. Um dos campos implementados pelo PersonViewModel é uma imagem de perfil baixada via WCF (armazenada em cache localmente em armazenamento isolado). O PersonSearchListViewModel é uma classe de contêiner que contém uma lista de pessoas. Como o carregamento de imagens é relativamente pesado, o PersonSearchListViewModel carrega apenas imagens para a página atual, a próxima e a anterior (os resultados são paginados na interface do usuário) ... para melhorar ainda mais a carga de imagens Eu coloco a carga de imagens em outro thread. No entanto, a abordagem multi-threading causa problemas de acesso entre 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();
        }
    }
}

Como você processa dados na classe ViewModel de maneira multi-threaded? Eu sei que você tem que usar o despachante na interface do usuário para atualizar. Como você atualiza o ViewModel vinculado à interface do usuário?

** EDITAR **

Há também mais um erro estranho acontecendo. No código abaixo:

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

Eu recebo um erro de linha cruzada ao tentar criar um novo objeto BitmapImage no thread de segundo plano. Por que não posso criar um novo objeto BitmapImage em um thread de segundo plano?