Operaciones asíncronas en WriteableBitmap

Estoy escribiendo una aplicación en WPF (C #) que realiza operaciones largas en una colección de mapas de bits. Para mantener mi aplicación receptiva, decidí usar otro hilo para realizar las operaciones en mapas de bits e informar el progreso en una barra de progreso en el hilo principal de la interfaz de usuario. Pensé que BackgroundWorker haría cualquier cosa por mí, pero parece que no será tan fácil.

Tengo el siguiente código:

public class ImageProcessor
{
    public Collection<WriteableBitmap> Pictures { get; private set; }
    private BackgroundWorker _worker = new BackgroundWorker();

    public ImageProcessor()
    {
        _worker.DoWork += DoWork;
    }

    public void DoLotsOfOperations()
    {
        _worker.RunWorkerAsync();
    }

    private void DoWork(object sender, DoWorkEventArgs e)
    {
        // operations on Pictures collection
    }
}

En el tiempo de ejecución, cargo imágenes utilizando un cuadro de diálogo de archivo abierto estándar en la colección de imágenes y luego invoco el método DoLotsOfOperations (). Pero tan pronto como intento acceder a cualquiera de las propiedades de un solo mapa de bits, obtengo la excepción InvalidOperationException: "El subproceso que realiza la llamada no puede acceder al objeto porque otro subproceso lo posee".

Obviamente, es cierto: cargué mapas de bits y completé la colección en el subproceso de la interfaz de usuario e intento leer los elementos de la colección en otro subproceso. Así que probé diferentes enfoques:

Pasé toda la colección como un parámetro del método RunWorkerAsync y lo recuperé en el método DoWork de e.Argument, pero luego, cuando intenté leer las propiedades de un solo mapa de bits, todavía obtuve la misma excepción.Intenté lo mismo, esta vez pasando un solo mapa de bits como argumento del trabajador de fondo y aún así no pude obtener ninguna de las propiedades del mapa de bits, y mucho menos los píxeles del mapa de bits.

Entonces, ¿cómo puedo acceder a los datos de mapa de bits dentro de otro hilo (y preferiblemente utilizando BackgroundWorker)?

No sé, tal vez todo mi enfoque es incorrecto. La idea general que quiero lograr es:

El usuario carga mapas de bits que luego se muestran en una ventana.El usuario hace clic en un botón y se realiza una operación prolongada en los mapas de bits, pero la interfaz de usuario responde (lo que permite al usuario, por ejemplo, cancelar la operación) y el progreso se informa en una barra de progreso.

Gracias de antemano por cualquier ayuda.

Respuestas a la pregunta(2)

Su respuesta a la pregunta