Forum: PC-Programmierung WPF C# image.Source wieder freigeben


von Bärnd (Gast)


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

von Bärnd (Gast)


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?

von Bärnd (Gast)


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...

von Ralle (Gast)


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);

von Bärnd (Gast)


Lesenswert?

wow, danke

dann bin ich ja schön im Kreis gelaufen :)

danke auch für die gute Erklärung again what learned

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.