Ottimizzazione delle prestazioni: risorse di applicazioniOptimizing Performance: Application Resources

WPFWPF consente di condividere le risorse dell'applicazione in modo che sia possibile supportare un aspetto o un comportamento coerente in elementi tipizzati simili.allows you to share application resources so that you can support a consistent look or behavior across similar-typed elements. In questo argomento vengono fornite alcune raccomandazioni in questa area che consentono di migliorare le prestazioni delle applicazioni.This topic provides a few recommendations in this area that can help you improve the performance of your applications.

Per altre informazioni sulle risorse, vedere Risorse XAML.For more information on resources, see XAML Resources.

Condivisione di risorseSharing resources

Se l'applicazione usa controlli personalizzati e definisce le risorse in un ResourceDictionary (nodo risorse XAML), è consigliabile definire le risorse a livello di Application o Window oppure definirle nel tema predefinito per i controlli personalizzati.If your application uses custom controls and defines resources in a ResourceDictionary (or XAML Resources node), it is recommended that you either define the resources at the Application or Window object level, or define them in the default theme for the custom controls. La definizione delle risorse nel ResourceDictionary di un controllo personalizzato impone un effetto sulle prestazioni per ogni istanza di tale controllo.Defining resources in a custom control's ResourceDictionary imposes a performance impact for every instance of that control. Se, ad esempio, si dispone di operazioni pennello a elevato utilizzo di prestazioni definite come parte della definizione di risorsa di un controllo personalizzato e di molte istanze del controllo personalizzato, l'working set dell'applicazione aumenterà significativamente.For example, if you have performance-intensive brush operations defined as part of the resource definition of a custom control and many instances of the custom control, the application's working set will increase significantly.

Per illustrare questo punto, tenere presente quanto segue.To illustrate this point, consider the following. Supponiamo che si stia sviluppando un gioco di carte usando WPFWPF.Let's say you are developing a card game using WPFWPF. Per la maggior parte dei giochi di carte sono necessarie 52 schede con 52 visi differenti.For most card games, you need 52 cards with 52 different faces. Si decide di implementare un controllo personalizzato di una scheda e si definiscono 52 pennelli (ognuno dei quali rappresenta un volto di scheda) nelle risorse del controllo personalizzato della scheda.You decide to implement a card custom control and you define 52 brushes (each representing a card face) in the resources of your card custom control. Nell'applicazione principale si creano inizialmente 52 istanze di questo controllo personalizzato della scheda.In your main application, you initially create 52 instances of this card custom control. Ogni istanza del controllo personalizzato della scheda genera 52 istanze di Brush oggetti, che fornisce un totale di 52 * 52 Brush oggetti nell'applicazione.Each instance of the card custom control generates 52 instances of Brush objects, which gives you a total of 52 * 52 Brush objects in your application. Spostando i pennelli fuori dalle risorse di controllo personalizzato per il Application o Window a livello di oggetto o definendoli nel tema predefinito per il controllo personalizzato, si riduce il working set dell'applicazione, perché ora si condividono i pennelli 52 tra 52 istanze del controllo scheda.By moving the brushes out of the card custom control resources to the Application or Window object level, or defining them in the default theme for the custom control, you reduce the working set of the application, since you are now sharing the 52 brushes among 52 instances of the card control.

Condivisione di un pennello senza copiaSharing a Brush without Copying

Se si dispone di più elementi che utilizzano lo stesso oggetto Brush, definire il pennello come risorsa e farvi riferimento, anziché definire il pennello inline in XAML.If you have multiple elements using the same Brush object, define the brush as a resource and reference it, rather than defining the brush inline in XAML. Questo metodo creerà un'istanza e la riutilizzerà, mentre la definizione dei pennelli inline in XAML crea una nuova istanza per ogni elemento.This method will create one instance and reuse it, whereas defining brushes inline in XAML creates a new instance for each element.

Nell'esempio di markup seguente viene illustrato questo punto:The following markup sample illustrates this point:

<StackPanel.Resources>
  <LinearGradientBrush x:Key="myBrush" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
    <LinearGradientBrush.GradientStops>
      <GradientStopCollection>
        <GradientStop Color="GoldenRod" Offset="0" />
        <GradientStop Color="White" Offset="1" />
      </GradientStopCollection>
    </LinearGradientBrush.GradientStops>
  </LinearGradientBrush>
</StackPanel.Resources>

<!-- Non-shared Brush object. -->
<Label>
  Label 1
  <Label.Background>
    <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
      <LinearGradientBrush.GradientStops>
        <GradientStopCollection>
          <GradientStop Color="GoldenRod" Offset="0" />
          <GradientStop Color="White" Offset="1" />
        </GradientStopCollection>
      </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
  </Label.Background>
</Label>

<!-- Shared Brush object. -->
<Label Background="{StaticResource myBrush}">Label 2</Label>
<Label Background="{StaticResource myBrush}">Label 3</Label>

Usare risorse statiche quando possibileUse Static Resources when Possible

Una risorsa statica fornisce un valore per qualsiasi attributo di proprietà XAML cercando un riferimento a una risorsa già definita.A static resource provides a value for any XAML property attribute by looking up a reference to an already defined resource. Il comportamento di ricerca per tale risorsa è analogo alla ricerca in fase di compilazione.Lookup behavior for that resource is analogous to compile-time lookup.

Una risorsa dinamica, d'altra parte, creerà un'espressione temporanea durante la compilazione iniziale e quindi rinvia la ricerca delle risorse finché il valore della risorsa richiesta non è effettivamente necessario per costruire un oggetto.A dynamic resource, on the other hand, will create a temporary expression during the initial compilation and thus defer lookup for resources until the requested resource value is actually required in order to construct an object. Il comportamento di ricerca per tale risorsa è analogo alla ricerca in fase di esecuzione, che impone un effetto sulle prestazioni.Lookup behavior for that resource is analogous to run-time lookup, which imposes a performance impact. Usare le risorse statiche laddove possibile nell'applicazione, usando risorse dinamiche solo quando necessario.Use static resources whenever possible in your application, using dynamic resources only when necessary.

L'esempio di markup seguente illustra l'uso di entrambi i tipi di risorse:The following markup sample shows the use of both types of resources:

<StackPanel.Resources>
  <SolidColorBrush x:Key="myBrush" Color="Teal"/>
</StackPanel.Resources>

<!-- StaticResource reference -->
<Label Foreground="{StaticResource myBrush}">Label 1</Label>

<!-- DynamicResource reference -->
<Label Foreground="{DynamicResource {x:Static SystemColors.ControlBrushKey}}">Label 2</Label>

Vedere ancheSee also