Procédure pas à pas : mise en cache de données d'application dans une application WPF
La mise en cache vous permet de stocker des données en mémoire pour y accéder rapidement. Lors d'un nouvel accès aux données, les applications peuvent les obtenir du cache au lieu de les extraire de la source d'origine. Cela peut améliorer le niveau de performance et l'évolutivité. En outre, la mise en cache rend les données disponibles lorsque la source de données est temporairement indisponible.
.NET Framework fournit des classes qui vous permettent d'utiliser la mise en cache dans les applications .NET Framework. Ces classes figurent dans l'espace de noms System.Runtime.Caching.
Remarque |
---|
L'espace de noms System.Runtime.Caching est une nouveauté de .NET Framework 4.Cet espace de noms rend la mise en cache disponible pour toutes les applications .NET Framework.Dans les versions précédentes du .NET Framework, la mise en cache était disponible uniquement dans l'espace de noms System.Web et nécessitait donc une dépendance sur les classes ASP.NET. |
Cette procédure pas à pas vous indique comment utiliser les fonctionnalités de mise en cache qui sont disponibles dans .NET Framework dans le cadre d'une application Windows Presentation Foundation (WPF). Dans la procédure pas à pas, vous mettez en cache le contenu d'un fichier texte.
Cette procédure pas à pas décrit les tâches suivantes :
Création d'un projet d'application WPF.
Ajout d'une référence à .NET Framework 4.
Initialisation d'un cache.
Ajout d'une entrée de cache qui abrite le contenu d'un fichier texte.
Fourniture d'une stratégie d'éviction pour l'entrée de cache.
Analyse du chemin d'accès du fichier mis en cache et notification auprès de l'instance de cache des modifications apportées à l'élément surveillé.
Composants requis
Pour exécuter cette procédure pas à pas, vous devez disposer des composants suivants :
Microsoft Visual Studio 2010.
Fichier texte contenant une petite quantité de texte. (Le contenu du fichier texte s'affiche dans une boîte de message.) Le code illustré dans la procédure pas à pas suppose que vous utilisez le fichier suivant :
c:\cache\cacheText.txt
Toutefois, vous pouvez utiliser n'importe quel fichier texte et apporter de petites modifications au code dans cette procédure pas à pas.
Création d'un projet d'application WPF
Vous allez commencer par créer un projet d'application WPF.
Pour créer une application WPF
Démarrez Visual Studio.
Dans le menu Fichier, cliquez sur Nouveau, puis sur Nouveau projet.
La boîte de dialogue Nouveau projet s'affiche.
Sous Modèles installés, sélectionnez le langage de programmation que vous souhaitez utiliser (Visual Basic ou Visual C#).
Dans la boîte de dialogue Nouveau projet, sélectionnez Application WPF.
Remarque Si vous ne voyez pas le modèle Application WPF, assurez-vous que vous ciblez une version du .NET Framework qui prend en charge WPF.Dans la boîte de dialogue Nouveau projet, sélectionnez .NET Framework 4 dans la liste.
Dans la zone de texte Nom, entrez un nom pour votre projet. Par exemple, vous pouvez entrer WPFCaching.
Activez la case à cocher Créer le répertoire pour la solution.
Cliquez sur OK.
Le Concepteur WPF s'ouvre en mode Création et affiche le fichier MainWindow.xaml. Visual Studio crée le dossier My Project, le fichier Application.xaml et le fichier MainWindow.xaml.
Ciblage du .NET Framework et ajout d'une référence aux assemblys de mise en cache
Par défaut, les applications WPF ciblent le .NET Framework 4 Client Profile. Pour utiliser l'espace de noms System.Runtime.Caching dans une application WPF, l'application doit cibler le .NET Framework 4 (pas le .NET Framework 4 Client Profile) et doit comprendre une référence à l'espace de noms.
Par conséquent, l'étape suivante consiste à modifier la cible du .NET Framework et à ajouter une référence à l'espace de noms System.Runtime.Caching.
Remarque |
---|
La procédure de modification de la cible du .NET Framework est différente dans un projet Visual Basic et dans un projet Visual C#. |
Pour modifier la cible du .NET Framework dans Visual Basic
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, puis cliquez sur Propriétés.
La fenêtre Propriétés de l'application s'affiche.
Cliquez sur l'onglet Compiler.
Dans la partie inférieure de la fenêtre, cliquez sur Options avancées de compilation.
La boîte de dialogue Paramètres avancés du compilateur s'affiche.
Dans la liste Framework cible (toutes les configurations), sélectionnez .NET Framework 4. (Ne sélectionnez pas .NET Framework 4 Client Profile.)
Cliquez sur OK.
La boîte de dialogue Modification du Framework cible s'affiche.
Dans la boîte de dialogue Modification du Framework cible, cliquez sur Oui.
Le projet est fermé puis rouvert.
Ajoutez une référence à l'assembly de mise en cache en suivant ces étapes :
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, puis cliquez sur Ajouter une référence.
Sélectionnez l'onglet .NET, sélectionnez System.Runtime.Caching, puis cliquez sur OK.
Pour modifier la cible du .NET Framework dans un projet Visual C#
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet puis cliquez sur Propriétés.
La fenêtre Propriétés de l'application s'affiche.
Cliquez sur l'onglet Application.
Dans la liste Framework cible, sélectionnez .NET Framework 4. (Ne sélectionnez pas .NET Framework 4 Client Profile.)
Ajoutez une référence à l'assembly de mise en cache en suivant ces étapes :
Cliquez avec le bouton droit sur le dossier Références, puis cliquez sur Ajouter une référence.
Sélectionnez l'onglet .NET, sélectionnez System.Runtime.Caching, puis cliquez sur OK.
Ajout d'un bouton dans la fenêtre WPF
Ensuite, vous allez ajouter un contrôle bouton et créer un gestionnaire d'événements pour l'événement Click du bouton. Ultérieurement, vous ajouterez du code de sorte que lorsque vous cliquez sur le bouton, le contenu du fichier texte est mis en cache et affiché.
Pour ajouter un contrôle bouton
Dans l'Explorateur de solutions, double-cliquez sur le fichier MainWindow.xaml pour l'ouvrir.
Dans la Boîte à outils, sous Contrôles WPF communs, faites glisser un contrôle Button dans la fenêtre MainWindow.
Dans la fenêtre Propriétés, définissez la propriété Content du contrôle Button sur Extraire du cache.
Initialisation du cache et mise en cache d'une entrée
Vous allez ensuite ajouter le code pour effectuer les tâches suivantes :
Créer une instance de la classe de cache, c'est-à-dire instancier un nouvel objet MemoryCache.
Spécifier que le cache utilise un objet HostFileChangeMonitor pour surveiller les modifications apportées dans le fichier texte.
Lire le fichier texte et mettre en cache son contenu en tant qu'entrée de cache.
Afficher le contenu du fichier texte mis en cache.
Pour créer l'objet de cache
Double-cliquez sur le bouton que vous venez d'ajouter afin de créer un gestionnaire d'événements dans le fichier MainWindow.xaml.cs ou MainWindow.Xaml.vb.
Au début du fichier (avant la déclaration de classe), ajoutez les instructions Imports (Visual Basic) ou using (C#) suivantes.
using System.Runtime.Caching; using System.IO;
Imports System.Runtime.Caching Imports System.IO
Dans le gestionnaire d'événements, ajoutez le code suivant pour instancier l'objet de cache :
ObjectCache cache = MemoryCache.Default;
Dim cache As ObjectCache = MemoryCache.Default
La classe ObjectCache est une classe intégrée qui fournit un cache d'objets en mémoire.
Ajoutez le code suivant pour lire le contenu d'une entrée de cache nommée filecontents :
Dim fileContents As String = TryCast(cache("filecontents"), String)
string fileContents = cache["filecontents"] as string;
Ajoutez le code suivant pour vérifier si l'entrée de cache nommée filecontents existe :
If fileContents Is Nothing Then End If
if (fileContents == null) { }
Si l'entrée de cache spécifiée n'existe pas, vous devez lire le fichier texte et l'ajouter au cache en tant qu'entrée de cache.
Dans le bloc if/then, ajoutez le code suivant pour créer un objet CacheItemPolicy qui spécifie que l'entrée de cache expire après 10 secondes.
Dim policy As New CacheItemPolicy() policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0)
CacheItemPolicy policy = new CacheItemPolicy(); policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0);
Si aucune information relative à l'éviction ou à l'expiration n'est fournie, la valeur par défaut est InfiniteAbsoluteExpiration, ce qui signifie que les entrées de cache n'expirent jamais seulement en fonction d'une heure absolue. Au lieu de cela, les entrées de cache expirent uniquement en cas de sollicitation de la mémoire. Il est recommandé de fournir explicitement une heure d'expiration absolue ou décalée.
À l'intérieur du bloc if/then et à la suite du code que vous avez ajouté au cours de l'étape précédente, ajoutez le code suivant pour créer une collection pour les chemins d'accès aux fichiers que vous souhaitez surveiller et pour ajouter le chemin d'accès du fichier texte à la collection :
Dim filePaths As New List(Of String)() filePaths.Add("c:\cache\cacheText.txt")
List<string> filePaths = new List<string>(); filePaths.Add("c:\\cache\\cacheText.txt");
Remarque Si le fichier texte que vous souhaitez utiliser n'est pas c:\cache\cacheText.txt, spécifiez le chemin d'accès du fichier texte que vous souhaitez utiliser.
À la suite du code que vous avez ajouté au cours de l'étape précédente, ajoutez le code suivant pour ajouter un objet HostFileChangeMonitor à la collection d'analyseurs de modification pour l'entrée de cache.
policy.ChangeMonitors.Add(New HostFileChangeMonitor(filePaths))
policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
L'objet HostFileChangeMonitor surveille le chemin d'accès du fichier texte et notifie le cache en cas de modification. Dans cet exemple, l'entrée de cache expire si le contenu du fichier change.
À la suite du code que vous avez ajouté au cours de l'étape précédente, ajoutez le code suivant pour lire le contenu du fichier texte :
fileContents = File.ReadAllText("c:\cache\cacheText.txt") & vbCrLf & DateTime.Now.ToString()
fileContents = File.ReadAllText("c:\\cache\\cacheText.txt") + + "\n" + DateTime.Now;
L'horodatage de la date et de l'heure est ajouté afin que vous puissiez voir quand l'entrée du cache expire.
À la suite du code que vous avez ajouté au cours de l'étape précédente, ajoutez le code suivant pour insérer le contenu du fichier dans l'objet de cache sous forme d'instance CacheItem :
cache.Set("filecontents", fileContents, policy)
cache.Set("filecontents", fileContents, policy);
Vous spécifiez les informations relatives à l'expulsion de l'entrée de cache en passant l'objet CacheItemPolicy juste créé comme paramètre.
Après le bloc if/then, ajoutez le code suivant pour afficher le contenu du fichier mis en cache dans une boîte de message :
MessageBox.Show(fileContents)
MessageBox.Show(fileContents);
Dans le menu Générer, cliquez sur Générer WPFCaching pour générer votre projet.
Test de la mise en cache dans l'application WPF
Vous pouvez maintenant tester l'application.
Pour tester la mise en cache dans l'application WPF
Appuyez sur CTRL+F5 pour exécuter l'application.
La fenêtre MainWindow s'affiche.
Cliquez sur Extraire du cache.
Le contenu mis en cache du fichier texte s'affiche dans une boîte de message. Notez l'horodatage du fichier.
Fermez la boîte de message, puis cliquez à nouveau sur Extraire du cache.
L'horodatage reste inchangé. Cela indique le contenu mis en cache est affiché.
Attendez au moins 10 secondes, puis cliquez à nouveau sur Extraire du cache.
Cette fois-ci, un nouvel horodatage s'affiche. Cela indique que la stratégie a permis à l'entrée de cache d'expirer et que le nouveau contenu mis en cache s'affiche.
Dans un éditeur de texte, ouvrez le fichier texte que vous avez créé. N'apportez pas encore de modifications.
Fermez la boîte de message, puis cliquez à nouveau sur Extraire du cache.
Notez à nouveau l'horodatage.
Apportez une modification au fichier texte, puis enregistrez le fichier.
Fermez la boîte de message, puis cliquez à nouveau sur Extraire du cache.
Cette boîte de message contient le contenu mis à jour du fichier texte et un nouvel horodatage. Cela indique que l'analyseur de modification de fichier d'hôte a procédé immédiatement à l'éviction de l'entrée du cache lorsque vous avez modifié le fichier, bien que le délai d'expiration absolue n'ait pas expiré.
Remarque Vous pouvez augmenter le temps d'éviction à 20 secondes ou plus pour disposer de plus de temps pour modifier le fichier.
Exemple de code
Une fois cette procédure pas à pas terminée, le code du projet que vous avez créé se présentera comme dans l'exemple suivant.
Imports System.Runtime.Caching
Imports System.IO
Class MainWindow
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
Dim cache As ObjectCache = MemoryCache.Default
Dim fileContents As String = TryCast(cache("filecontents"), _
String)
If fileContents Is Nothing Then
Dim policy As New CacheItemPolicy()
policy.AbsoluteExpiration = _
DateTimeOffset.Now.AddSeconds(10.0)
Dim filePaths As New List(Of String)()
filePaths.Add("c:\cache\cacheText.txt")
policy.ChangeMonitors.Add(New _
HostFileChangeMonitor(filePaths))
' Fetch the file contents.
fileContents = File.ReadAllText("c:\cache\cacheText.txt") & vbCrLf & DateTime.Now.ToString()
cache.Set("filecontents", fileContents, policy)
End If
MessageBox.Show(fileContents)
End Sub
End Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Runtime.Caching;
using System.IO;
namespace WPFCaching
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
ObjectCache cache = MemoryCache.Default;
string fileContents = cache["filecontents"] as string;
if (fileContents == null)
{
CacheItemPolicy policy = new CacheItemPolicy();
policy.AbsoluteExpiration =
DateTimeOffset.Now.AddSeconds(10.0);
List<string> filePaths = new List<string>();
filePaths.Add("c:\\cache\\cacheText.txt");
policy.ChangeMonitors.Add(new
HostFileChangeMonitor(filePaths));
// Fetch the file contents.
fileContents = File.ReadAllText("c:\\cache\\cacheText.txt") + "\n" + DateTime.Now.ToString();
cache.Set("filecontents", fileContents, policy);
}
MessageBox.Show(fileContents);
}
}
}