Operações assíncronas no WriteableBitmap

Estou escrevendo um aplicativo no WPF (c #) que faz operações longas em uma coleção de bitmaps. Para manter meu aplicativo responsivo, decidi usar outro thread para executar as operações nos bitmaps e relatar o progresso em uma barra de progresso no thread principal da interface do usuário. Eu pensei que o BackgroundWorker faria qualquer coisa por mim, mas parece que não será tão fácil.

Eu tenho o seguinte 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
    }
}

No tempo de execução, carrego imagens usando um diálogo de arquivo aberto padrão na coleção Pictures e, em seguida, invoco o método DoLotsOfOperations (). Mas assim que eu tento acessar qualquer uma das propriedades de um único bitmap, recebo InvalidOperationException: "O segmento de chamada não pode acessar o objeto porque o segmento diferente o possui".

É obviosly verdade - eu carreguei bitmaps e preenchi a coleção no thread de interface do usuário e tento ler elementos de coleção em outro segmento. Então eu tentei abordagens diferentes:

Eu passei a coleção inteira como um parâmetro do método RunWorkerAsync e a recuperei no método DoWork do e.Argument, mas quando tentei ler as propriedades de um único bitmap, ainda obtive a mesma exceção.Eu tentei a mesma coisa, desta vez passando um único bitmap como argumento do backgroundworker e ainda não consegui obter nenhuma das propriedades do bitmap, muito menos os pixels do bitmap.

Então, como posso acessar os dados do bitmap dentro de outro thread (e de preferência usando o BackgroundWorker)?

Eu não sei, talvez toda a minha abordagem esteja errada. A ideia geral que quero alcançar é:

O usuário carrega bitmaps que são exibidos em uma janela.O usuário clica em um botão e uma longa operação nos bitmaps é executada, mas a interface do usuário é responsiva (o que permite ao usuário, por exemplo, cancelar a operação) e o progresso é relatado em uma barra de progresso.

Agradecemos antecipadamente por qualquer ajuda.

questionAnswers(2)

yourAnswerToTheQuestion