Procedura dettagliata: memorizzazione dei dati di un'applicazione nella cache di 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 anziché recuperarli dall'origine. Ciò può migliorare prestazioni e scalabilità. Inoltre, la memorizzazione nella cache rende disponibili i dati quando l'origine dati non è temporaneamente disponibile.
.NET Framework fornisce le classi che consentono di utilizzare 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 a tutte le applicazioni .NET Framework.Nelle versioni precedenti di .NET Framework la memorizzazione nella cache è disponibile solo nello spazio dei nomi System.Web e pertanto richiede una dipendenza nelle classi ASP.NET. |
In questa procedura dettagliata viene illustrato come utilizzare la funzionalità della memorizzazione nella cache, disponibile in .NET Framework, come parte di un'applicazione Windows Presentation Foundation (WPF). Nella procedura dettagliata, viene memorizzato nella cache il contenuto di un file di testo.
Di seguito vengono illustrate le attività incluse nella procedura dettagliata:
Creazione di un progetto di applicazione WPF.
Aggiunta di un riferimento a .NET Framework 4.
Inizializzazione di una cache.
Aggiunta di una voce della cache che include il contenuto di un file di testo.
Fornitura di criteri dell'eliminazione per la voce della cache.
Monitoraggio del percorso del file memorizzato nella cache e notifica all'istanza della cache delle modifiche dell'elemento monitorato.
Prerequisiti
Per completare questa procedura dettagliata, è necessario disporre di quanto segue:
Microsoft Visual Studio 2010.
Un file di testo contenente una piccola quantità di testo. Si visualizzerà il contenuto del file di testo in una finestra di messaggio. Nel codice illustrato nella procedura dettagliata si suppone che si utilizzi il file seguente:
c:\cache\cacheText.txt
Tuttavia, è possibile utilizzare qualsiasi file di testo e apportare piccole modifiche al codice di questa procedura dettagliata.
Creazione di un progetto di applicazione WPF
Si inizierà con la creazione di un progetto di applicazione WPF.
Per creare un'applicazione WPF
Avviare Visual Studio.
Scegliere Nuovo dal menu File, quindi Nuovo progetto.
Verrà visualizzata la finestra di dialogo Nuovo progetto.
In Modelli installati selezionare il linguaggio di programmazione da utilizzare (Visual Basic o Visual C#).
Nella finestra di dialogo Nuovo progetto selezionare Applicazione WPF.
Nota Se il modello Applicazione WPF non è visualizzato, verificare che sia stata scelta come destinazione una versione di .NET Framework che supporta WPF.Nella finestra di dialogo Nuovo progetto selezionare .NET Framework 4 dall'elenco.
Nella casella di testo Nome immettere un nome per il progetto. Ad esempio, è possibile immettere WPFCaching.
Selezionare la casella di controllo Crea directory per soluzione.
Scegliere OK.
Il file MainWindow.xaml verrà visualizzato nella visualizzazione Progettazione in WPF Designer. In Visual Studio vengono creati la cartella My Project, il file Application.xaml e il file MainWindow.xaml.
Scelta di .NET Framework come destinazione e aggiunta di un riferimento agli assembly di cache
Per impostazione predefinita, le applicazioni WPF sono destinate a .NET Framework 4 Client Profile. Per utilizzare lo spazio dei nomi System.Runtime.Caching in un'applicazione WPF, è necessario che l'applicazione sia destinata a .NET Framework 4, non a .NET Framework 4 Client Profile, e includa un riferimento allo spazio dei nomi.
Pertanto, il passaggio seguente consiste nella modifica della destinazione .NET Framework e nell'aggiunta di un riferimento allo spazio dei nomi System.Runtime.Caching.
Nota |
---|
La procedura per la modifica della destinazione .NET Framework è diversa in un progetto Visual Basic e in un progetto Visual C#. |
Per modificare la versione di .NET Framework di destinazione in Visual Basic
In Esplora soluzioni fare clic con il pulsante destro del mouse sul nome del progetto, quindi scegliere Proprietà.
Verrà visualizzata la finestra delle proprietà per l'applicazione.
Fare clic sulla scheda Compila.
Nella parte inferiore della finestra, fare clic su Opzioni di compilazione avanzate ....
Verrà visualizzata la finestra di dialogo Impostazioni del compilatore avanzate.
Nell'elenco Framework di destinazione (tutte le configurazioni) selezionare .NET Framework 4, non .NET Framework 4 Client Profile.
Scegliere OK.
Verrà visualizzata la finestra di dialogo Modifica versione .NET Framework di destinazione.
Nella finestra di dialogo Modifica versione .NET Framework di destinazione fare clic su Sì.
Il progetto verrà chiuso e riaperto.
Per aggiungere un riferimento all'assembly di cache, effettuare i passaggi seguenti:
Fare clic con il pulsante destro del mouse sul nome del progetto in Esplora soluzioni, quindi scegliere Aggiungi riferimento.
Selezionare la scheda .NET, scegliere System.Runtime.Caching, quindi fare clic su OK.
Per modificare la versione di .NET Framework di destinazione in un progetto Visual C#
In Esplora soluzioni fare clic con il pulsante destro del mouse sul nome del progetto, quindi scegliere Proprietà.
Verrà visualizzata la finestra delle proprietà per l'applicazione.
Fare clic sulla scheda Applicazione.
Nell'elenco Framework di destinazione selezionare .NET Framework 4. Non selezionare .NET Framework 4 Client Profile.
Per aggiungere un riferimento all'assembly di cache, effettuare i passaggi seguenti:
Fare clic con il pulsante destro del mouse sulla cartella Riferimenti, quindi scegliere Aggiungi riferimento.
Selezionare la scheda .NET, scegliere System.Runtime.Caching, quindi fare clic su OK.
Aggiunta di un pulsante alla finestra WPF
Successivamente, si aggiungerà un controllo pulsante e si creerà un gestore dell'evento per l'evento Click del pulsante. Si aggiungerà quindi codice mediante il quale facendo clic sul pulsante verrà memorizzato nella cache e visualizzato il contenuto del file di testo.
Per aggiungere un pulsante
In Esplora soluzioni aprire il file MainWindow.xaml facendo doppio clic su di esso.
In Controlli comuni WPF nella Casella degli strumenti trascinare un controllo Button nella finestra MainWindow.
Nella finestra Proprietà impostare la proprietà Content del controllo Button su Ottieni cache.
Inizializzazione della cache e memorizzazione di una voce nella cache
Successivamente, si aggiungerà il codice per eseguire le attività seguenti:
Creare un'istanza della classe cache (ossia 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 memorizzare nella cache il relativo 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 dell'evento nel file MainWindow.Xaml.vb o MainWindow.xaml.cs.
All'inizio del file (prima della dichiarazione di classe), aggiungere le istruzioni Imports (Visual Basic) o using (C#) seguenti.
using System.Runtime.Caching; using System.IO;
Imports System.Runtime.Caching Imports System.IO
Nel gestore dell'evento aggiungere il codice riportato di seguito per creare un'istanza dell'oggetto cache.
ObjectCache cache = MemoryCache.Default;
Dim cache As ObjectCache = MemoryCache.Default
ObjectCache è una classe incorporata che fornisce una cache dell'oggetto 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 della cache specificata non esiste, è necessario leggere il file di testo e aggiungerlo alla cache come voce della cache.
Nel blocco if/then aggiungere il codice seguente 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 viene fornita alcuna informazione di eliminazione o scadenza, l'impostazione predefinita è InfiniteAbsoluteExpiration secondo cui le voci della cache non scadono mai solo in base a un tempo assoluto. Viceversa, le voci della cache scadono solo in condizioni di pressione della memoria. Come procedura consigliata, è sempre opportuno fornire esplicitamente una scadenza assoluta o variabile.
All'interno del blocco if/then, seguendo il codice aggiunto nel passaggio precedente, aggiungere il codice seguente per creare un insieme per i percorsi file che si desidera monitorare e aggiungere il percorso del file di testo all'insieme:
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 utilizzare non è c:\cache\cacheText.txt specificare il percorso del file di testo da utilizzare.
Seguendo il codice aggiunto nel passaggio precedente, aggiungere il codice seguente per aggiungere un nuovo oggetto HostFileChangeMonitor all'insieme di monitoraggio 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 notifica alla cache se si verificano modifiche. In questo esempio la voce della cache scadrà se il contenuto del file viene modificato.
Seguendo 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;
Viene aggiunto il timestamp di data e ora per consentire di vedere la scadenza della voce della cache.
Seguendo il codice aggiunto nel passaggio precedente, aggiungere il codice seguente per inserire il contenuto del file nell'oggetto cache come un'istanza di CacheItem:
cache.Set("filecontents", fileContents, policy)
cache.Set("filecontents", fileContents, policy);
Specificare informazioni sulla voce della cache da eliminare 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 del messaggio.
MessageBox.Show(fileContents)
MessageBox.Show(fileContents);
Per compilare il progetto scegliere Compila WPFCaching dal menu Compila.
Test della memorizzazione nella cache nell'applicazione WPF
È ora possibile eseguire il test dell'applicazione.
Per sottoporre a test la memorizzazione nella cache nell'applicazione WPF
Premere CTRL+F5 per eseguire l'applicazione.
Verrà visualizzata la finestra MainWindow.
Fare clic su Ottieni cache.
Il contenuto memorizzato nella cache del file di testo verrà visualizzato in una finestra di messaggio. Si noti il timestamp nel file.
Chiudere la finestra di messaggio e fare di nuovo clic su Ottieni cache.
Il timestamp è invariato. Questo indica che viene visualizzato il contenuto memorizzato nella cache.
Attendere 10 secondi o più, quindi fare nuovamente clic su Ottieni cache.
Questa volta viene visualizzato un nuovo timestamp. Questo indica che i criteri consentono alla voce della cache di scadere e che viene visualizzato il nuovo contenuto della cache.
In un editor di testo aprire il file di testo creato. Non apportare ancora alcuna modifica.
Chiudere la finestra di messaggio e fare di nuovo clic su Ottieni cache.
Si noti nuovamente il timestamp.
Apportare una modifica al file di testo e salvarlo.
Chiudere la finestra di messaggio e fare di nuovo clic su Ottieni cache.
Questa finestra di messaggio contiene il contenuto aggiornato del file di testo e un nuovo timestamp. Questo indica che il monitoraggio delle modifiche del file host ha immediatamente eliminato la voce della cache quando si è apportata la modifica, anche se il periodo di timeout assoluto non è scaduto.
Nota È possibile aumentare il tempo di eliminazione a 20 secondi o più, per disporre di più tempo per apportare la modifica nel file.
Esempio di codice
Dopo avere completato questa procedura dettagliata, l'aspetto del codice per il progetto sarà simile all'esempio seguente.
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);
}
}
}