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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren