Silverlight Performanceprobleme mit dem BusyIndicator Control

27. Mai 2011

Neulich ist mir beim Schreiben einer Silverlight Anwendung aufgefallen, dass die CPU Auslastung meiner Anwendung permanent über 20% lag und dies, obwohl keinerlei sichtbare Animationen liefen oder ich eine Aktion ausgelöst hätte.

 

Um die Ursache zu erforschen fügte ich zunächst die Zeile

   1: <param name="enableRedrawRegions" 

   2: value="true"/>

in der Default.aspx (im silverlightControlHost div) ein.

Dies bewirkt, dass GUI-Aktualisierungen grafisch dargestellt werden (generell sehr empfehlenswert zu Analysezwecken und insbesondere bei hoher CPU-Last).

Das Ergebnis war überraschend:

=> Das gesamte Anwendungsfenster flackerte permanent bunt. Was ist hier schief gelaufen?

Nach einigem Suchen fand ich die Ursache, ich hatte das Silverlight Business Application Template verwendet, dass von Haus aus ein BusyIndicator Control mitbringt. Durch Auskommentieren des Controls konnte ich verifizieren, dass die andauernde CPU Auslastung durch dieses Control verursacht wurde.

Die Lösung:

Die ProgressBar im Busyindicator Control hat das Property IsIndeterminate. Dieses ist per Default auf “True” gesetzt.

   1: <Setter Property="IsIndeterminate" Value="True"/>

Dadurch läuft die Animation des Ladebalkens permanent in einer Endlosschleife.

Dieses Verhalten kann man abstellen, in dem man im Hidden-VisualState (Control ist ausgeblendet) den Wert IsIndeterminate auf false und im Visible State wieder auf true setzt:

   1: <!-- set indeterminate in Hidden State -->

   2: <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" 

   3:                                Duration="00:00:00.001"

   4:                                Storyboard.TargetName="progressbar"

5: Storyboard.TargetProperty="(UIElement.IsIndeterminate)">

   6:     <DiscreteObjectKeyFrame KeyTime="00:00:00">

   7:         <DiscreteObjectKeyFrame.Value>

   8:             <sys:Boolean>False</sys:Boolean>

   9:         </DiscreteObjectKeyFrame.Value>

  10:     </DiscreteObjectKeyFrame>

  11: </ObjectAnimationUsingKeyFrames>

Fazit:

Was mir an Silverlight besonders gut gefällt, ist, dass man (Dank XAML) diverse Möglichkeiten hat das Verhalten und Aussehen von Controls zu steuern. Die Controls sind keine Blackboxes wie dieses Beispiel zeigt. Das Verhalten des Progressbars konnte ich einfach (über den Visual State Manager) im XAML anpassen. Allerdings erfordert dieses Vorgehen auch immer fundierte Kenntnisse über die Möglichkeiten und Mächtigkeit von XAML.