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.