WPF C# image.Source wieder freigeben

Gast #5274499
Lesenswert?
• ▲
▼
Hi,

ich habe das Problem mit unterschiedlichen Threads auf ein <image> 
object zu schreiben...

das Aufbau ist einfach...
ich habe im WPF ein Image (leeres object).

direkt nach der Initialisierung lade ich dort "mit dem Hauptthread" ein 
Bild hinein:
> meinBild.Source = new BitmapImage(new Uri(@"C:\bildpfad....jpg"));

jetzt eröffne ich einen neuen Thread:
1
        public async Task ImgPrc()
2
        {
3
            await Task.Run(() =>
4
            {
5
                meinBild.Source = new BitmapImage(new Uri(@"C:\andererPfad....jpg"));
6
            });
7
        }

jetzt meldet er (was ja auch irgendwie logisch ist), dass er nicht auf 
den object zufreigen kann, weil es von einem anderen Thread genutzt 
wird...

im Internet habe ich schon was von "freeze()" gelesen, aber ich bin mir 
nicht sicher, ob das eher die "Bilddatei" freigibt als das object!?

wie kann ich "meinBild" wieder zugänglich machen?

PS. meinBild existiert bereits in der xaml und wird nicht durch den c# 
code erzeugt...

Vielen Dank
Gast #5274522
Lesenswert?
• ▲
▼
ich habe das gefunden:
1
        public void setImage(BitmapImage bimp)
2
        {
3
            if (Dispatcher.CheckAccess())
4
            {
5
                meinBild.Source = bimp;
6
            }
7
            else
8
            {
9
                Dispatcher.Invoke(new Action(() =>
10
                {
11
                    setImage(bimp);
12
                }));
13
            }
14
        }

leider hilft das nicht weiter...
=> vermutlich wende ich es falsch an?
Gast #5274529
Lesenswert?
• ▲
▼
sorry, falsche quelle kopiert:
1
        public void setImage(BitmapImage bimp)
2
        {
3
            if (meinBild.Dispatcher.CheckAccess())
4
            {
5
                meinBild.Source = bimp;
6
            }
7
            else
8
            {
9
                meinBild.Dispatcher.Invoke(new Action(() =>
10
                {
11
                    setImage(bimp);
12
                }));
13
            }
14
        }


der Dispatcher läuft zwar durch, aber wenn ich dann letztendlich die 
Source setzen will, kommt wieder der Fehler, dass diese in diesem Thread 
nicht verfügbar ist...
Gast #5274568
Lesenswert?
• ▲
▼
Die Verwendung des Dispatchers ist schon richtig, da du Image nur im 
Hauptthread verändern kannst.

Erstellst du eine ImageSource (also BitmapImage) in einem anderen 
Thread, kannst du sie nur im Hauptthread nutzen, wenn du sie freezt.

So ungefähr sollte es ausserhalb des Hauptthreads gehen:
1
var bmp = new BitmapImage(new Uri(@"C:\andererPfad....jpg"));
2
bmp.Freeze();
3
setImage(bmp);

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.