Condividi tramite


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

  1. Avvia Visual Studio.

  2. Nel menu File fare clic su Nuovoe quindi su Nuovo progetto.

    Viene visualizzata la finestra di dialogo Nuovo progetto.

  3. In Modelli installatiselezionare il linguaggio di programmazione da usare (Visual Basic o Visual C#).

  4. 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.

  5. Nella casella di testo Nome, inserire un nome per il progetto. Ad esempio, è possibile immettere WPFCaching.

  6. Selezionare la casella di controllo Crea directory per la soluzione.

  7. 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

  1. 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.

  2. Fare clic sulla scheda Compilazione.

  3. Nella parte inferiore della finestra fare clic su Opzioni di compilazione avanzate....

    Viene visualizzata la finestra di dialogo Impostazioni avanzate del compilatore.

  4. Nell'elenco Framework di destinazione (tutte le configurazioni) selezionare .NET Framework 4. Non selezionare il .NET Framework 4 Client Profile.

  5. Fare clic su OK.

    Viene visualizzata la finestra di dialogo modifica del framework di destinazione.

  6. Nella finestra di dialogo Modifica del Framework di Destinazione, fare clic su .

    Il progetto viene chiuso e quindi riaperto.

  7. Aggiungere un riferimento all'assembly di memorizzazione nella cache seguendo questa procedura:

    1. In Esplora soluzioni , fare clic con il pulsante destro del mouse sul nome del progetto e quindi selezionare Aggiungi riferimento.

    2. Selezionare la scheda .NET, selezionare System.Runtime.Cachinge quindi fare clic su OK.

Per modificare il .NET Framework di destinazione in un progetto di Visual C#

  1. 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.

  2. Fare clic sulla scheda Applicazione.

  3. Nell'elenco dei framework di destinazione, selezionare .NET Framework 4. Non selezionare il Profilo Client di .NET Framework 4.

  4. Aggiungere un riferimento all'assembly di cache seguendo questa procedura:

    1. Fare clic con il pulsante destro del mouse sulla cartella Riferimenti e quindi fare clic su Aggiungi riferimento.

    2. Selezionare la scheda .NET, selezionare System.Runtime.Cachinge 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

  1. In Esplora Soluzioni, fare doppio clic sul file MainWindow.xaml per aprirlo.

  2. Dalla casella degli strumenti , in Controlli WPF comuni, trascinare il controllo Button nella finestra MainWindow.

  3. 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

  1. Fare doppio clic sul pulsante appena aggiunto per creare un gestore eventi nel file MainWindow.xaml.cs o MainWindow.Xaml.vb.

  2. Nella parte superiore del file (prima della dichiarazione di classe) aggiungere le istruzioni Imports (Visual Basic) o using (C#):

    using System.Runtime.Caching;
    using System.IO;
    
    Imports System.Runtime.Caching
    Imports System.IO
    
  3. 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.

  4. 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;
    
  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. 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.

  10. 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.

  11. 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);
    
  12. 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

  1. Premere CTRL+F5 per eseguire l'applicazione.

    Viene visualizzata la finestra MainWindow.

  2. 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.

  3. 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.

  4. 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.

  5. In un editor di testo aprire il file di testo creato. Non apportare ancora modifiche.

  6. Chiudere la finestra del messaggio e quindi fare di nuovo clic su Recuperare la cache.

    Nota di nuovo il timestamp.

  7. Apportare una modifica al file di testo e quindi salvare il file.

  8. 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