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.