Laden...

BitmapImage im BackroundWorker

Erstellt von dennisspohr vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.302 Views
dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 14 Jahren
BitmapImage im BackroundWorker

Hallo zusammen,

ich habe ein Problem mit dem BackgroundWorker und das Laden eines BitmapImages von der URL. Über folgenden Code lade ich das Bild in der DoWork-Methode des BackroundWorkers herunter:

    
            BitmapImage image = new BitmapImage();
            image.BeginInit();
            image.CacheOption = BitmapCacheOption.None;
            image.UriCachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache);
            image.UriSource = new Uri(url);
            image.EndInit();
            //image.Freeze();

            e.Result = image;

Das BItmapImage wird über e.Result an das Event RunWorkerCompleted übergeben. Wenn ich dann das BitmapImage einem Image-Control übergebe, kommt folgender Fehler:

Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet.

Im Internet gibt es ein paar Antworten auf dieses Problem, die sagen, man solle nach dem image.EndInit() ein image.Freeze() aufrufen, doch dann kommt bei mir folgender Fehler:

Dieses Freezable-Objekt kann nicht fixiert werden.

Habt ihr eine Idee, was ich evtl. falsch mache? Danke!

Grüße
Dennis

297 Beiträge seit 2008
vor 14 Jahren

Hallo,
ich habe neulich etwas ähnliches gemacht. Ich wollte ein Bild asynchron laden und anschließend einem Image zuweisen:

BitmapImage bmi = new BitmapImage();
bmi.BeginInit();
bmi.UriSource = uri;
bmi.EndInit();

bmi.Freeze();

ImageControl.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate { ImageControl.Source = bmi; });

ImageControl ist dabei das Image und dieser Code-Ausschnitt wurde in eine Methode ausgelagert. Aufgerufen wird diese in einem neuen Thread:

Thread thread = new Thread(new ParameterizedThreadStart(LoadImage));
thread.Start(uri);

Vom Prinzip her also fast das Gleiche wie bei dir, allerdings musst du den Dispatcher verwenden um den von dir genannten Fehler zu beheben. Hat zumindest bei mir so funktioniert.

There are 10 kind of people, those who understand binary and those who don't.

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 14 Jahren

Hallo Schlopp,

interessant, eigentlich ist es ja genau das gleiche, was der BackgroundWorker auch macht. Ich werde es trotzdem mal ausprobieren.

Danke & Grüße
Dennis

U
1.688 Beiträge seit 2007
vor 14 Jahren

Hallo,

wie wird denn der BGW erzeugt? Mit Sicherheit aus dem UI-Thread?

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 14 Jahren

Hallo ujr,

ja das wird er.

Grüße
Dennis

297 Beiträge seit 2008
vor 14 Jahren

Ich hatte, wie gesagt, genau das gleiche Problem, der Dispatcher hat dieses dann behoben.

There are 10 kind of people, those who understand binary and those who don't.