Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
BitmapImage im BackroundWorker
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

BitmapImage im BackroundWorker

beantworten | zitieren | melden

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:
Zitat
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:
Zitat
Dieses Freezable-Objekt kann nicht fixiert werden.

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

Grüße
Dennis
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dennisspohr am .
private Nachricht | Beiträge des Benutzers
Schlopp
myCSharp.de - Member

Avatar #avatar-3124.jpg


Dabei seit:
Beiträge: 297
Herkunft: Stuttgart, München, Schweiz

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1.688

beantworten | zitieren | melden

Hallo,

wie wird denn der BGW erzeugt? Mit Sicherheit aus dem UI-Thread?
private Nachricht | Beiträge des Benutzers
dennisspohr
myCSharp.de - Member

Avatar #avatar-2982.jpg


Dabei seit:
Beiträge: 420
Herkunft: Westerwald

Themenstarter:

beantworten | zitieren | melden

Hallo ujr,

ja das wird er.

Grüße
Dennis
private Nachricht | Beiträge des Benutzers
Schlopp
myCSharp.de - Member

Avatar #avatar-3124.jpg


Dabei seit:
Beiträge: 297
Herkunft: Stuttgart, München, Schweiz

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers