Tile Asynchron aktualsieren beim Programmstart Tile Asynchron aktualsieren beim Programmstart
Ergebnis 1 bis 3 von 3
  1. 25.09.2013, 21:58
    #1
    Hallo zusammen

    Ich habe mal wieder eine Frage bezüglich dem asynchronen Ausführen von Code. Mein Ziel ist es, beim Programmstart das LiveTile zu aktualisieren, ohne das der Programmstart drastisch verlangsamt wird.

    Das aktualisieren funktioniert soweit schon einwandfrei, wo ich jetzt noch ein Problem habe, ist beim Teil mit der Performance. Aufgerufen wird das Ganze im App.xaml.cs. Die Idee war über Task.Factory den Code in einem eigenen Thread ausführen zu lassen:
    Code:
    Action actionUpdateTile = () => Deployment.Current.Dispatcher.BeginInvoke(Utilities.UpdateTile);
    Task.Factory.StartNew(actionUpdateTile);
    In der CreateTile funktion wird anschliessend die Namen der ersten neun Bilder ausgelesen, diese werden aus der Medienbibliothek geladen zu einer Liste hinzugefügt und anschliessend über die Telerikklasse als Tile Image gesetzt.

    Code:
            public static void UpdateTile()
            {
                try
                {
                   var tileData = new RadCycleTileData();
                   var dbLIst = App.ViewModel.LoadTileLocations();
    
    
                    var locationList =
                        dbLIst.Where(
                            x => !String.IsNullOrEmpty(x.ImageUri) && !String.IsNullOrEmpty(x.ImageName))
                            .Reverse()
                            .Take(9)
                            .ToList();
    
    
                    var uriList = new List<Uri>();
                    var i = 0;
                    using (var file = IsolatedStorageFile.GetUserStoreForApplication())
                    {
                        foreach (var item in locationList)
                        {
                            try
                            {
                                using (var fileStream = file.OpenFile("Shared/ShellContent/" +
                                                                  i + ".jpg", FileMode.Create))
                                {
                                    var bmp = new WriteableBitmap(GetImage(item.ImageName));
                                    bmp.SaveJpeg(fileStream, bmp.PixelWidth, bmp.PixelHeight, 0, 30);
    
    
                                    uriList.Add(new Uri("isostore:/shared/ShellContent/" + i + ".jpg", UriKind.Absolute));
                                    i++;
                                }
                            } catch (Exception) {}
                        }
                    }
    
    
                    tileData.CycleImages = uriList;
                    LiveTileHelper.UpdateTile(ShellTile.ActiveTiles.FirstOrDefault(), tileData);
                }
                catch (OutOfMemoryException ex)
                {
                    Api.LogError(
                        "Zuviel Speicherverbrauch beim Tile Aktualisieren. Aktueller Memory Verbrauch: " +
                        Microsoft.Phone.Info.DeviceStatus.ApplicationCurrentMemoryUsage + "Peak: " +
                        Microsoft.Phone.Info.DeviceStatus.ApplicationPeakMemoryUsage, ex);
                }
                catch (Exception ex)
                {
                    Api.LogError(ex.Message, ex);
                } 
            }
    Das Ganze verlangsamt nun leider den Programmstart um ca. 5 - 10 Sekunden, was natürlich ziemlich unschön ist. Kann mir jemand sagen was ich genau falsch mache ?

    Danke und Gruss
    0
     

  2. 26.09.2013, 09:40
    #2
    Das Problem ist dass das Rendering in WritableBitmaps eigentlich immer auf dem UI-Thread geschehen muss. D.h. dein Hintergrundthread wird wohl durch die Telerik-Klassen dafür automatisch wieder mit dem UI-Thread synchronisiert. Eine Möglichkeit die mir jetzt einfallen würde, wäre halt das Rendering erst zu starten wenn die App fertig geladen ist.

    Was mich halt eher wundert ist, dass das Rendering da bei dir so lange zu dauern scheint. Sonst gäbe es ja nicht so eine große Verzögerung.
    1
     

  3. 26.09.2013, 13:34
    #3
    Danke für deine Antwort. Das erklärt einiges. Wenn ich es erst nach dem Start anwerfe klappt es soweit das der Start nicht verlangsamt wird. Jedoch kann ich dann ein paar Sekunden nichts anwählen, was auch nicht optimal ist.

    Ich habe nochmals nachgemessen. Ohne die Funktion dauert es ca. 2-3 Sekunden zum öffnen der App. Mit ca 6-7, was doch ein ziemliche Verschlechterung ist. Ich vermute dass das so lange dauert weil ich die Bilder beim laden aus der Medienbibliothek in der vollen Auflösung bekommen. Allenfalls wäre es der bessere Weg hier mit einer Optimierung anzusetzen.
    0
     

Ähnliche Themen

  1. Tile Benachrichtigung beim XBox Live Hub geht nicht
    Von ChrisXP im Forum Windows Phone 7 Allgemein
    Antworten: 0
    Letzter Beitrag: 25.09.2011, 21:45
  2. Probleme beim Aktualsieren und telefonieren..
    Von Unregistriert im Forum HTC HD2 Sonstiges
    Antworten: 1
    Letzter Beitrag: 16.12.2009, 15:37
  3. Display Auflösung beim Programmstart abfragen
    Von klovierb im Forum Programmieren
    Antworten: 2
    Letzter Beitrag: 13.04.2009, 14:32
  4. Sound beim Einschalten
    Von Ddriver im Forum Plauderecke
    Antworten: 8
    Letzter Beitrag: 22.05.2003, 11:17
  5. Display-Flimmern beim Loox
    Von Newton im Forum Plauderecke
    Antworten: 1
    Letzter Beitrag: 28.10.2002, 20:46

Besucher haben diese Seite mit folgenden Suchbegriffen gefunden:

statt programmstart nokia windowsphone kommt !