Autor Beitrag
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 07.03.16 22:27 
Hallo,

ich habe hier eine UWP-App, die in einer GridView Bilder anzeigt, die aus dem Netz heruntergeladen werden. Bisher mache ich das so, dass es pro Bild die Instanz einer Klasse gibt, die folgende Eigenschaft enthält:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
    private BitmapImage image = null;
    public BitmapImage Image {
      get
      {
        if (image == null)
        {
          image = new BitmapImage(new Uri(Url));
        }
          
        return image;
      }
    }

Im XAML-Code ist jeweils eine Instanz der Klasse dann der DataContext für einen Listeneintrag und ich kann die Source-Eigenschaft einer Image-Komponente an die obige Image-Eigenschaft binden. Das funktioniert wunderbar und während der Laufzeit der App wird jedes Bild nur genau einmal heruntergeladen.

Da diese Liste an Bildern im Netz aber über lange Zeiten unverändert bleibt (und höchstens erweitert wird), macht es Sinn, bereits heruntergeladene Bilder dauerhaft im Cache zu speichern, sodass sie auch beim nächsten Start der App nicht nochmal heruntergeladen werden. Und da ist mein Problem. Da Zugriffe auf das Dateisystem in UWP ja alle asynchron sind, hat die Methode, um ein Bild aus dem Cache zu laden (oder bei Bedarf herunterzuladen), automatisch eine solche Signatur:

ausblenden C#-Quelltext
1:
private async Task<BitmapImage> GetCachedImage()					


Die kann ich ja aber nicht im Getter einer Eigenschaft aufrufen, weil der nicht asynchron sein kann. Wie bekomme ich jetzt also möglichst elegant die Bilder ins GridView?

Vielen Dank im Voraus,
viele Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 07.03.16 23:16 
Ohne Details von UWP zu kennen solltest du nicht einfach GetCachedImage().Result im getter abrufen können? Der Zugriff auf Result blockiert bis das Ergebnis da ist und somit bist du wieder synchron.

Für diesen Beitrag haben gedankt: Christian S.
Christian S. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 07.03.16 23:46 
Auf die Idee war ich tatsächlich noch nicht gekommen (:autsch:). Danke dafür!

Leider funktioniert sie nicht :(
Der Code läuft dann in einen Deadlock, wie ich leider feststellen musste. Erklärung hier unter "Async all the way", gefunden hierüber.

Ich werde jetzt wohl vor dem Einfügen in die Liste von extern eine Methode aufrufen, die das image-Feld asyncrhon füllt, bevor der Getter das erste Mal aufgerufen wird. Für andere Ideen bin ich aber weiterhin offen und lasse daher den Status des Threads auch erstmal so ;)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".