Procedura dettagliata: Memorizzazione nella cache dei dati dell'applicazione in un'applicazione WPF
La memorizzazione nella cache consente di archiviare i dati in memoria per l'accesso rapido. Quando si accede nuovamente ai dati, le applicazioni possono ottenere i dati dalla cache invece di recuperarli dall'origine originale. Ciò può migliorare le prestazioni e la scalabilità. Inoltre, la memorizzazione nella cache rende disponibili i dati quando l'origine dati non è temporaneamente disponibile.
.NET Framework fornisce classi che consentono di usare la memorizzazione nella cache nelle applicazioni .NET Framework. Queste classi si trovano nello spazio dei nomi System.Runtime.Caching.
Nota
Lo spazio dei nomi System.Runtime.Caching è nuovo in .NET Framework 4. Questo spazio dei nomi rende disponibile la memorizzazione nella cache per tutte le applicazioni .NET Framework. Nelle versioni precedenti di .NET Framework la memorizzazione nella cache era disponibile solo nello spazio dei nomi System.Web e pertanto richiedeva una dipendenza dalle classi ASP.NET.
Questa procedura dettagliata illustra come usare la funzionalità di memorizzazione nella cache disponibile in .NET Framework come parte di un'applicazione Windows Presentation Foundation (WPF). Nel walkthrough, memorizzi nella cache il contenuto di un file di testo.
Le attività illustrate in questa procedura dettagliata includono quanto segue:
Creazione di un progetto di applicazione WPF.
Aggiunta di un riferimento a .NET Framework 4.
Inizializzazione di una cache.
Aggiunta di un elemento della cache contenente il contenuto di un file di testo.
Fornire un criterio di evizione per la voce della cache.
Monitoraggio del percorso del file memorizzato nella cache e notifica all'istanza della cache delle modifiche apportate all'elemento monitorato.
Prerequisiti
Per portare a termine questa procedura dettagliata, è necessario:
Visual Studio 2010.
File di testo che contiene una piccola quantità di testo. Verrà visualizzato il contenuto del file di testo in una finestra di messaggio. Il codice illustrato nella procedura dettagliata presuppone che si stia usando il file seguente:
c:\cache\cacheText.txt
Tuttavia, è possibile usare qualsiasi file di testo e apportare piccole modifiche al codice in questa procedura dettagliata.
Creazione di un progetto di applicazione WPF
Si inizierà creando un progetto di applicazione WPF.
Per creare un'applicazione WPF
Avvia Visual Studio.
Nel menu File
fare clic su Nuovo e quindi suNuovo progetto .Viene visualizzata la finestra di dialogo Nuovo progetto.
In Modelli installatiselezionare il linguaggio di programmazione da usare (Visual Basic o Visual C#).
Nella finestra di dialogo Nuovo Progetto, selezionare applicazione WPF.
Nota
Se non viene visualizzato il modello dell'Applicazione WPF, assicurarsi che hai selezionato una versione del .NET Framework che supporta WPF. Nella finestra di dialogo Nuovo Progetto, selezionare .NET Framework 4 dall'elenco.
Nella casella di testo Nome, inserire un nome per il progetto. Ad esempio, è possibile immettere WPFCaching.
Selezionare la casella di controllo Crea directory per la soluzione.
Fare clic su OK.
Il Designer WPF si apre in visualizzazione Progettazione e mostra il file MainWindow.xaml. Visual Studio crea la cartella My Project, il file Application.xaml e il file MainWindow.xaml.
Destinazione di .NET Framework e aggiunta di un riferimento agli assembly di memorizzazione nella cache
Per impostazione predefinita, le applicazioni WPF hanno come destinazione il profilo client .NET Framework 4. Per usare lo spazio dei nomi System.Runtime.Caching in un'applicazione WPF, l'applicazione deve avere come destinazione .NET Framework 4 (non il profilo client .NET Framework 4) e deve includere un riferimento allo spazio dei nomi.
Il passaggio successivo consiste pertanto nel modificare la destinazione di .NET Framework e aggiungere un riferimento allo spazio dei nomi System.Runtime.Caching.
Nota
La procedura per modificare la destinazione .NET Framework è diversa in un progetto Visual Basic e in un progetto Visual C#.
Per cambiare il .NET Framework di destinazione in Visual Basic
In Esplora soluzioni , fare clic con il pulsante destro del mouse sul nome del progetto e quindi fare clic su Proprietà .
Viene visualizzata la finestra delle proprietà per l'applicazione.
Fare clic sulla scheda Compilazione.
Nella parte inferiore della finestra fare clic su Opzioni di compilazione avanzate....
Viene visualizzata la finestra di dialogo Impostazioni avanzate del compilatore.
Nell'elenco
Framework di destinazione (tutte le configurazioni) selezionare .NET Framework 4. Non selezionare il .NET Framework 4 Client Profile. Fare clic su OK.
Viene visualizzata la finestra di dialogo modifica del framework di destinazione.
Nella finestra di dialogo Modifica del Framework di Destinazione, fare clic su Sì.
Il progetto viene chiuso e quindi riaperto.
Aggiungere un riferimento all'assembly di memorizzazione nella cache seguendo questa procedura:
In Esplora soluzioni , fare clic con il pulsante destro del mouse sul nome del progetto e quindi selezionare Aggiungi riferimento.
Selezionare la scheda .NET, selezionare
System.Runtime.Caching
e quindi fare clic su OK.
Per modificare il .NET Framework di destinazione in un progetto di Visual C#
In Esplora soluzionifare clic con il pulsante destro del mouse sul nome del progetto e quindi scegliere proprietà .
Viene visualizzata la finestra delle proprietà per l'applicazione.
Fare clic sulla scheda Applicazione.
Nell'elenco dei framework di destinazione, selezionare .NET Framework 4. Non selezionare il Profilo Client di .NET Framework 4.
Aggiungere un riferimento all'assembly di cache seguendo questa procedura:
Fare clic con il pulsante destro del mouse sulla cartella Riferimenti e quindi fare clic su Aggiungi riferimento.
Selezionare la scheda .NET, selezionare
System.Runtime.Caching
e quindi fare clic su OK.
Aggiunta di un pulsante alla finestra WPF
Successivamente, si aggiungerà un pulsante di controllo e si creerà un gestore dell'evento per l'evento del pulsante Click
. Successivamente si aggiungerà il codice a in modo che quando si fa clic sul pulsante, il contenuto del file di testo viene memorizzato nella cache e visualizzato.
Per aggiungere un controllo pulsante
In Esplora Soluzioni, fare doppio clic sul file MainWindow.xaml per aprirlo.
Dalla casella degli strumenti , in Controlli WPF comuni, trascinare il controllo
Button
nella finestraMainWindow
.Nella finestra Proprietà
impostare la proprietà del controllo su Recupera cache .
Inizializzazione della cache e caching di un elemento
Successivamente, si aggiungerà il codice per eseguire le attività seguenti:
Creare un'istanza della classe cache, ovvero creare un'istanza di un nuovo oggetto MemoryCache.
Specificare che la cache utilizza un oggetto HostFileChangeMonitor per monitorare le modifiche nel file di testo.
Leggere il file di testo e memorizzarne nella cache il contenuto come voce della cache.
Visualizzare il contenuto del file di testo memorizzato nella cache.
Per creare l'oggetto cache
Fare doppio clic sul pulsante appena aggiunto per creare un gestore eventi nel file MainWindow.xaml.cs o MainWindow.Xaml.vb.
Nella parte superiore del file (prima della dichiarazione di classe) aggiungere le istruzioni
Imports
(Visual Basic) ousing
(C#):using System.Runtime.Caching; using System.IO;
Imports System.Runtime.Caching Imports System.IO
Nel gestore eventi aggiungere il codice seguente per creare un'istanza dell'oggetto cache:
ObjectCache cache = MemoryCache.Default;
Dim cache As ObjectCache = MemoryCache.Default
La classe ObjectCache è una classe predefinita che fornisce una cache di oggetti in memoria.
Aggiungere il codice seguente per leggere il contenuto di una voce della cache denominata
filecontents
:Dim fileContents As String = TryCast(cache("filecontents"), String)
string fileContents = cache["filecontents"] as string;
Aggiungere il codice seguente per verificare se la voce della cache denominata
filecontents
esiste:If fileContents Is Nothing Then End If
if (fileContents == null) { }
Se la voce di cache specificata non esiste, è necessario leggere il file di testo e aggiungerlo come voce della cache alla cache.
Aggiungere il seguente codice nel blocco
if/then
per creare un nuovo oggetto CacheItemPolicy che specifica che la voce della cache scade dopo 10 secondi.Dim policy As New CacheItemPolicy() policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0)
CacheItemPolicy policy = new CacheItemPolicy(); policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0);
Se non vengono fornite informazioni di rimozione o scadenza, il valore predefinito è InfiniteAbsoluteExpiration, il che significa che le voci della cache non scadono mai basato esclusivamente su un tempo assoluto. Al contrario, le voci della cache scadono solo quando si verifica un utilizzo elevato di memoria. Come procedura consigliata, è consigliabile fornire sempre in modo esplicito una scadenza assoluta o variabile.
All'interno del blocco
if/then
e dopo il codice aggiunto nel passaggio precedente, aggiungere il codice seguente per creare una raccolta per i percorsi di file da monitorare e aggiungere il percorso del file di testo alla raccolta: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");
Nota
Se il file di testo da usare non è
c:\cache\cacheText.txt
, specificare il percorso in cui si vuole usare il file di testo.Dopo il codice aggiunto nel passaggio precedente, aggiungere il codice seguente per aggiungere un nuovo oggetto HostFileChangeMonitor all'insieme di monitoraggi delle modifiche per la voce della cache:
policy.ChangeMonitors.Add(New HostFileChangeMonitor(filePaths))
policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
L'oggetto HostFileChangeMonitor monitora il percorso del file di testo e invia una notifica alla cache in caso di modifiche. In questo esempio, la voce della cache verrà eliminata se il contenuto del file cambia.
Dopo il codice aggiunto nel passaggio precedente, aggiungere il codice seguente per leggere il contenuto del file di testo:
fileContents = File.ReadAllText("c:\cache\cacheText.txt") & vbCrLf & DateTime.Now.ToString()
fileContents = File.ReadAllText("c:\\cache\\cacheText.txt") + "\n" + DateTime.Now;
Il timestamp di data e ora viene aggiunto per consentirti di vedere quando scadrà l'elemento della cache.
Dopo il codice aggiunto nel passaggio precedente, aggiungere il codice seguente per inserire il contenuto del file nell'oggetto cache come istanza di CacheItem:
cache.Set("filecontents", fileContents, policy)
cache.Set("filecontents", fileContents, policy);
Specifichi informazioni sul modo in cui l'entry della cache dovrebbe essere eliminata passando l'oggetto CacheItemPolicy creato in precedenza come parametro.
Dopo il blocco
if/then
, aggiungere il codice seguente per visualizzare il contenuto del file memorizzato nella cache in una finestra di messaggio:MessageBox.Show(fileContents)
MessageBox.Show(fileContents);
Nel menu Compila fare clic su Compila WPFCaching per compilare il progetto.
Test della memorizzazione nella cache nell'applicazione WPF
È ora possibile testare l'applicazione.
Per testare la memorizzazione nella cache nell'applicazione WPF
Premere CTRL+F5 per eseguire l'applicazione.
Viene visualizzata la finestra
MainWindow
.Fare clic su Recupera la cache.
Il contenuto memorizzato nella cache dal file di testo viene visualizzato in una finestra di messaggio. Si noti il timestamp nel file.
Chiudere la finestra di messaggio e quindi fare di nuovo clic su Recupera cache.
Il timestamp è invariato. Indica che il contenuto memorizzato nella cache viene visualizzato.
Attendere 10 secondi o più e quindi fare di nuovo clic su Recupera cache.
Questa volta viene visualizzato un nuovo timestamp. Ciò indica che i criteri consentono la scadenza della voce della cache e che viene visualizzato il nuovo contenuto memorizzato nella cache.
In un editor di testo aprire il file di testo creato. Non apportare ancora modifiche.
Chiudere la finestra del messaggio e quindi fare di nuovo clic su Recuperare la cache.
Nota di nuovo il timestamp.
Apportare una modifica al file di testo e quindi salvare il file.
Chiudere la finestra di messaggio e quindi fare di nuovo clic su Recupera cache.
Questa finestra di messaggio contiene il contenuto aggiornato dal file di testo e un nuovo timestamp. Ciò indica che il monitor delle modifiche dei file host ha rimosso immediatamente l'elemento della cache quando è stato modificato il file, anche se il timeout assoluto non era scaduto.
Nota
È possibile aumentare il tempo di rimozione a 20 secondi o più per consentire più tempo per apportare una modifica nel file.
Esempio di codice
Dopo aver completato questa procedura dettagliata, il codice per il progetto creato sarà simile all'esempio seguente.
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);
}
}
}
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
Vedere anche
.NET Desktop feedback