Asynchrone Operationen auf WriteableBitmap
Ich schreibe eine Anwendung in WPF (C #), die lange Operationen für eine Sammlung von Bitmaps ausführt. Damit meine Anwendung nicht reagiert, habe ich beschlossen, einen anderen Thread zu verwenden, um die Vorgänge für Bitmaps auszuführen und den Fortschritt auf einer Fortschrittsanzeige im Haupt-UI-Thread zu melden. Ich dachte, BackgroundWorker würde alles für mich tun, aber es scheint nicht so einfach zu sein.
Ich habe folgenden Code:
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
}
}
Zur Laufzeit lade ich Bilder mithilfe eines Standarddialogs zum Öffnen von Dateien in die Pictures-Auflistung und rufe dann die DoLotsOfOperations () -Methode auf. Sobald ich jedoch versuche, auf eine der Eigenschaften einer einzelnen Bitmap zuzugreifen, erhalte ich die InvalidOperationException: "Der aufrufende Thread kann nicht auf das Objekt zugreifen, da es einem anderen Thread gehört".
Es ist offensichtlich wahr - ich habe Bitmaps geladen und die Auflistung im UI-Thread aufgefüllt, und ich versuche, Auflistungselemente in einem anderen Thread zu lesen. Also habe ich verschiedene Ansätze ausprobiert:
Ich habe die gesamte Auflistung als Parameter der RunWorkerAsync-Methode übergeben und sie in der DoWork-Methode von e.Argument abgerufen, aber als ich dann versuchte, die Eigenschaften einer einzelnen Bitmap zu lesen, trat immer noch dieselbe Ausnahme auf.Ich habe das Gleiche versucht, diesmal habe ich eine einzelne Bitmap als Hintergrundargument übergeben und trotzdem konnte ich keine der Eigenschaften der Bitmap abrufen, geschweige denn die Pixel der Bitmap.Wie kann ich auf die Bitmap-Daten in einem anderen Thread zugreifen (und am besten BackgroundWorker verwenden)?
Ich weiß nicht, vielleicht ist mein ganzer Ansatz falsch. Die allgemeine Idee, die ich erreichen möchte, ist:
Der Benutzer lädt Bitmaps, die dann in einem Fenster angezeigt werden.Der Benutzer klickt auf eine Schaltfläche und es wird eine lange Operation auf den Bitmaps ausgeführt, aber die Benutzeroberfläche reagiert (was es dem Benutzer beispielsweise ermöglicht, die Operation abzubrechen), und der Fortschritt wird in einer Fortschrittsleiste angezeigt.Vielen Dank im Voraus für jede Hilfe.