Operacje asynchroniczne na mapie WriteableBitmap

Piszę aplikację w WPF (C #), która wykonuje długie operacje na kolekcji bitmap. Aby moja aplikacja była responsywna, postanowiłem użyć innego wątku, aby wykonać operacje na mapach bitowych i zgłosić postęp na pasku postępu w głównym wątku interfejsu użytkownika. Myślałem, że BackgroundWorker zrobi dla mnie wszystko, ale wygląda na to, że nie będzie to takie proste.

Mam następujący kod:

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

W czasie wykonywania ładuję obrazy przy użyciu standardowego okna dialogowego otwartego pliku do kolekcji Pictures, a następnie wywołuję metodę DoLotsOfOperations (). Ale gdy tylko próbuję uzyskać dostęp do którejkolwiek z właściwości pojedynczej bitmapy, otrzymuję InvalidOperationException: „Wątek wywołujący nie może uzyskać dostępu do obiektu, ponieważ posiada inny wątek”.

Jest to prawda - załadowałem bitmapy i zapełniłem kolekcję w wątku interfejsu użytkownika i próbuję odczytać elementy kolekcji w innym wątku. Próbowałem różnych podejść:

Przekazałem całą kolekcję jako parametr metody RunWorkerAsync i odzyskałem ją w metodzie DoWork z e.Argument, ale kiedy próbowałem odczytać właściwości pojedynczej bitmapy, nadal mam ten sam wyjątek.Próbowałem tego samego, tym razem przekazując pojedynczą bitmapę jako argument użytkownika tła, a mimo to nie udało mi się uzyskać żadnej z właściwości bitmapy, nie mówiąc już o pikselach bitmapy.

Jak więc uzyskać dostęp do danych mapy bitowej w innym wątku (a najlepiej przy użyciu BackgroundWorker)?

Nie wiem, może moje podejście jest złe. Ogólna idea, którą chcę osiągnąć, to:

Użytkownik ładuje mapy bitowe, które są następnie wyświetlane w oknie.Użytkownik klika przycisk i wykonywana jest długa operacja na mapach bitowych, ale interfejs użytkownika reaguje (co pozwala użytkownikowi na przykład anulować operację), a postęp jest zgłaszany na pasku postępu.

Z góry dziękuję za wszelką pomoc.

questionAnswers(2)

yourAnswerToTheQuestion