Procedura dettagliata: memorizzazione dei dati di un'applicazione nella cache di un'applicazione WPFWalkthrough: Caching Application Data in a WPF Application

La memorizzazione nella cache consente di inserire i dati in memoria per l'accesso rapido.Caching enables you to store data in memory for rapid access. Quando accedono nuovamente ai dati, le applicazioni possono recuperarli dalla cache anziché dall'origine.When the data is accessed again, applications can get the data from the cache instead of retrieving it from the original source. In questo modo si possono ottenere migliori prestazioni e scalabilità.This can improve performance and scalability. Inoltre, se si memorizzano i dati nella cache, questi sono accessibili anche quando l'origine dati è temporaneamente non disponibile.In addition, caching makes data available when the data source is temporarily unavailable.

Il .NET Framework fornisce classi che consentono di usare la memorizzazione nella cache nelle applicazioni .NET Framework.The .NET Framework provides classes that enable you to use caching in .NET Framework applications. Queste classi si trovano nello spazio dei nomi System.Runtime.Caching.These classes are located in the System.Runtime.Caching namespace.

Nota

Lo spazio dei nomi System.Runtime.Caching è nuovo in .NET Framework 4.The System.Runtime.Caching namespace is new in the .NET Framework 4. Questo spazio dei nomi rende disponibile la memorizzazione nella cache per tutte le applicazioni .NET Framework.This namespace makes caching is available to all .NET Framework applications. Nelle versioni precedenti del .NET Framework, la memorizzazione nella cache era disponibile solo nello spazio dei nomi System.Web e pertanto richiedeva una dipendenza dalle classi ASP.NET.In previous versions of the .NET Framework, caching was available only in the System.Web namespace and therefore required a dependency on ASP.NET classes.

In questa procedura dettagliata viene illustrato come utilizzare la funzionalità di memorizzazione nella cache disponibile nel .NET Framework come parte di un'applicazione Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF).This walkthrough shows you how to use the caching functionality that is available in the .NET Framework as part of a Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) application. Nella procedura dettagliata viene memorizzato nella cache il contenuto di un file di testo.In the walkthrough, you cache the contents of a text file.

Di seguito vengono illustrate le attività incluse nella procedura dettagliata:Tasks illustrated in this walkthrough include the following:

  • Creazione di un progetto di applicazione WPF.Creating a WPF application project.

  • Aggiunta di un riferimento al .NET Framework 4.Adding a reference to the .NET Framework 4.

  • Inizializzazione di una cache.Initializing a cache.

  • Aggiunta di una voce della cache che contiene il contenuto di un file di testo.Adding a cache entry that contains the contents of a text file.

  • Fornire un criterio di rimozione per la voce della cache.Providing an eviction policy for the cache entry.

  • Monitoraggio del percorso del file memorizzato nella cache e notifica all'istanza della cache le modifiche apportate all'elemento monitorato.Monitoring the path of the cached file and notifying the cache instance about changes to the monitored item.

PrerequisitesPrerequisites

Per completare questa procedura dettagliata, è necessario:In order to complete this walkthrough, you will need:

  • Visual Studio 2010.Visual Studio 2010.

  • Un file di testo che contiene una piccola quantità di testo.A text file that contains a small amount of text. Il contenuto del file di testo viene visualizzato in una finestra di messaggio. Il codice illustrato nella procedura dettagliata presuppone che si stia utilizzando il file seguente:(You will display the contents of the text file in a message box.) The code illustrated in the walkthrough assumes that you are working with the following file:

    c:\cache\cacheText.txt

    Tuttavia, è possibile usare qualsiasi file di testo e apportare piccole modifiche al codice in questa procedura dettagliata.However, you can use any text file and make small changes to the code in this walkthrough.

Creazione di un progetto di applicazione WPFCreating a WPF Application Project

Si inizierà creando un progetto di applicazione WPF.You will start by creating a WPF application project.

Per creare un'applicazione WPFTo create a WPF application

  1. Avviare Visual Studio.Start Visual Studio.

  2. Scegliere nuovodal menu file , quindi fare clic su nuovo progetto.In the File menu, click New, and then click New Project.

    Verrà visualizzata la finestra di dialogo Nuovo progetto.The New Project dialog box is displayed.

  3. In modelli installatiselezionare il linguaggio di programmazione che si desidera utilizzare (Visual Basic o oggetto C#visivo ).Under Installed Templates, select the programming language you want to use (Visual Basic or Visual C#).

  4. Nella finestra di dialogo nuovo progetto selezionare applicazione WPF.In the New Project dialog box, select WPF Application.

    Nota

    Se il modello applicazione WPF non è visibile, assicurarsi che la destinazione sia una versione del .NET Framework che supporta WPF.If you do not see the WPF Application template, make sure that you are targeting a version of the .NET Framework that supports WPF. Nella finestra di dialogo nuovo progetto selezionare .NET Framework 4 nell'elenco.In the New Project dialog box, select .NET Framework 4 from the list.

  5. Nella casella di testo nome immettere un nome per il progetto.In the Name text box, enter a name for your project. Ad esempio, è possibile immettere WPFCaching.For example, you can enter WPFCaching.

  6. Selezionare la casella di controllo Crea directory per soluzione.Select the Create directory for solution check box.

  7. Fare clic su OK.Click OK.

    WPF Designer viene aperto in visualizzazione progettazione e visualizza il file MainWindow. XAML.The WPF Designer opens in Design view and displays the MainWindow.xaml file. Visual Studio crea la cartella del progetto , il file Application. XAML e il file MainWindow. XAML.Visual Studio creates the My Project folder, the Application.xaml file, and the MainWindow.xaml file.

Destinazione della .NET Framework e aggiunta di un riferimento agli assembly di memorizzazione nella cacheTargeting the .NET Framework and Adding a Reference to the Caching Assemblies

Per impostazione predefinita, le applicazioni WPF sono destinate al profilo client di .NET Framework 4.By default, WPF applications target the .NET Framework 4 Client Profile. Per utilizzare lo spazio dei nomi System.Runtime.Caching in un'applicazione WPF, è necessario che l'applicazione sia destinata al .NET Framework 4 (non al profilo client .NET Framework 4) e che includa un riferimento allo spazio dei nomi.To use the System.Runtime.Caching namespace in a WPF application, the application must target the .NET Framework 4 (not the .NET Framework 4 Client Profile) and must include a reference to the namespace.

Il passaggio successivo consiste quindi nel modificare la destinazione .NET Framework e aggiungere un riferimento allo spazio dei nomi System.Runtime.Caching.Therefore, the next step is to change the .NET Framework target and add a reference to the System.Runtime.Caching namespace.

Nota

La procedura per la modifica della destinazione .NET Framework è diversa in un progetto Visual Basic e in un C# progetto visuale.The procedure for changing the .NET Framework target is different in a Visual Basic project and in a Visual C# project.

Per modificare la .NET Framework di destinazione in Visual BasicTo change the target .NET Framework in Visual Basic

  1. In Esplora soluzionifare clic con il pulsante destro del mouse sul nome del progetto, quindi scegliere Proprietà.In Solutions Explorer, right-click the project name, and then click Properties.

    Verrà visualizzata la finestra proprietà per l'applicazione.The properties window for the application is displayed.

  2. Fare clic sulla scheda Compila.Click the Compile tab.

  3. Nella parte inferiore della finestra fare clic su Opzioni di compilazione avanzate.At the bottom of the window, click Advanced Compile Options….

    Viene visualizzata la finestra di dialogo impostazioni del compilatore avanzate .The Advanced Compiler Settings dialog box is displayed.

  4. Nell'elenco Framework di destinazione (tutte le configurazioni) selezionare .NET Framework 4.In the Target framework (all configurations) list, select .NET Framework 4. (Non selezionare .NET Framework 4 profilo client).(Do not select .NET Framework 4 Client Profile.)

  5. Fare clic su OK.Click OK.

    Viene visualizzata la finestra di dialogo Modifica del framework di destinazione.The Target Framework Change dialog box is displayed.

  6. Nella finestra di dialogo modifica Framework di destinazione fare clic su .In the Target Framework Change dialog box, click Yes.

    Il progetto viene chiuso e quindi riaperto.The project is closed and is then reopened.

  7. Aggiungere un riferimento all'assembly di Caching attenendosi alla procedura seguente:Add a reference to the caching assembly by following these steps:

    1. In Esplora soluzionifare clic con il pulsante destro del mouse sul nome del progetto, quindi scegliere Aggiungi riferimento.In Solution Explorer, right-click the name of the project and then click Add Reference.

    2. Selezionare la scheda .NET , selezionare System.Runtime.Cachinge quindi fare clic su OK.Select the .NET tab, select System.Runtime.Caching, and then click OK.

Per modificare la .NET Framework di destinazione in un C# progetto VisualTo change the target .NET Framework in a Visual C# project

  1. In Esplora soluzionifare clic con il pulsante destro del mouse sul nome del progetto, quindi scegliere Proprietà.In Solution Explorer, right-click the project name and then click Properties.

    Verrà visualizzata la finestra proprietà per l'applicazione.The properties window for the application is displayed.

  2. Fare clic sulla scheda Applicazione .Click the Application tab.

  3. Nell'elenco Framework di destinazione selezionare .NET Framework 4.In the Target framework list, select .NET Framework 4. (Non selezionare .NET Framework 4 profilo client).(Do not select .NET Framework 4 Client Profile.)

  4. Aggiungere un riferimento all'assembly di Caching attenendosi alla procedura seguente:Add a reference to the caching assembly by following these steps:

    1. Fare clic con il pulsante destro del mouse sulla cartella riferimenti , quindi scegliere Aggiungi riferimento.Right-click the References folder and then click Add Reference.

    2. Selezionare la scheda .NET , selezionare System.Runtime.Cachinge quindi fare clic su OK.Select the .NET tab, select System.Runtime.Caching, and then click OK.

Aggiunta di un pulsante alla finestra WPFAdding a Button to the WPF Window

Successivamente, si aggiungerà un controllo Button e si creerà un gestore eventi per l'evento Click del pulsante.Next, you will add a button control and create an event handler for the button's Click event. Successivamente, quando si fa clic sul pulsante viene aggiunto il codice, il contenuto del file di testo viene memorizzato nella cache e visualizzato.Later you will add code to so when you click the button, the contents of the text file are cached and displayed.

Per aggiungere un controllo ButtonTo add a button control

  1. In Esplora soluzionifare doppio clic sul file MainWindow. XAML per aprirlo.In Solution Explorer, double-click the MainWindow.xaml file to open it.

  2. Dalla casella degli strumenti, sotto controlli WPF comunitrascinare un controllo Button nella finestra di MainWindow.From the Toolbox, under Common WPF Controls, drag a Button control to the MainWindow window.

  3. Nella finestra Proprietà impostare la proprietà Content del controllo Button per ottenere la cache.In the Properties window, set the Content property of the Button control to Get Cache.

Inizializzazione della cache e memorizzazione nella cache di una voceInitializing the Cache and Caching an Entry

Successivamente, verrà aggiunto il codice per eseguire le attività seguenti:Next, you will add the code to perform the following tasks:

  • Creare un'istanza della classe cache, ovvero si creerà un'istanza di un nuovo oggetto MemoryCache.Create an instance of the cache class—that is, you will instantiate a new MemoryCache object.

  • Consente di specificare che la cache utilizza un oggetto HostFileChangeMonitor per monitorare le modifiche nel file di testo.Specify that the cache uses a HostFileChangeMonitor object to monitor changes in the text file.

  • Leggere il file di testo e memorizzare nella cache il relativo contenuto come voce della cache.Read the text file and cache its contents as a cache entry.

  • Visualizza il contenuto del file di testo memorizzato nella cache.Display the contents of the cached text file.

Per creare l'oggetto cacheTo create the cache object

  1. Fare doppio clic sul pulsante appena aggiunto per creare un gestore eventi nel file MainWindow.xaml.cs o MainWindow. XAML. vb.Double-click the button you just added in order to create an event handler in the MainWindow.xaml.cs or MainWindow.Xaml.vb file.

  2. Nella parte superiore del file (prima della dichiarazione di classe) aggiungere le seguenti istruzioni Imports (Visual Basic) o using (C#):At the top of the file (before the class declaration), add the following Imports (Visual Basic) or using (C#) statements:

    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:In the event handler, add the following code to instantiate the cache object:

    ObjectCache cache = MemoryCache.Default;
    
    Dim cache As ObjectCache = MemoryCache.Default
    

    La classe ObjectCache è una classe incorporata che fornisce una cache di oggetti in memoria.The ObjectCache class is a built-in class that provides an in-memory object cache.

  4. Aggiungere il codice seguente per leggere il contenuto di una voce della cache denominata filecontents:Add the following code to read the contents of a cache entry named 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:Add the following code to check whether the cache entry named filecontents exists:

    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 come voce della cache alla cache.If the specified cache entry does not exist, you must read the text file and add it as a cache entry to the cache.

  6. Nel blocco if/then aggiungere il codice seguente per creare un nuovo oggetto CacheItemPolicy che specifichi che la voce della cache scade dopo 10 secondi.In the if/then block, add the following code to create a new CacheItemPolicy object that specifies that the cache entry expires after 10 seconds.

    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 rimozione o scadenza, il valore predefinito è InfiniteAbsoluteExpiration, il che significa che le voci della cache non scadono mai in base a un tempo assoluto.If no eviction or expiration information is provided, the default is InfiniteAbsoluteExpiration, which means the cache entries never expire based only on an absolute time. Al contrario, le voci della cache scadono solo quando si verifica un numero eccessivo di richieste di memoria.Instead, cache entries expire only when there is memory pressure. Come procedura consigliata, è consigliabile specificare sempre in modo esplicito una scadenza assoluta o variabile.As a best practice, you should always explicitly provide either an absolute or a sliding expiration.

  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 che si desidera monitorare e per aggiungere il percorso del file di testo alla raccolta:Inside the if/then block and following the code you added in the previous step, add the following code to create a collection for the file paths that you want to monitor, and to add the path of the text file to the 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");
    

    Nota

    Se il file di testo che si desidera utilizzare non è c:\cache\cacheText.txt, specificare il percorso in cui si desidera utilizzare il file di testo.If the text file you want to use is not c:\cache\cacheText.txt, specify the path where the text file is that you want to use.

  8. Dopo il codice aggiunto nel passaggio precedente, aggiungere il codice seguente per aggiungere un nuovo oggetto HostFileChangeMonitor alla raccolta di monitoraggi delle modifiche per la voce della cache:Following the code that you added in the previous step, add the following code to add a new HostFileChangeMonitor object to the collection of change monitors for the cache entry:

    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 se si verificano modifiche.The HostFileChangeMonitor object monitors the text file's path and notifies the cache if changes occur. In questo esempio, la voce della cache scadrà se il contenuto del file viene modificato.In this example, the cache entry will expire if the content of the file changes.

  9. Dopo il codice aggiunto nel passaggio precedente, aggiungere il codice seguente per leggere il contenuto del file di testo:Following the code that you added in the previous step, add the following code to read the contents of the text file:

    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 in modo che sia possibile visualizzare la scadenza della voce della cache.The date and time timestamp is added so that you will be able to see when the cache entry expires.

  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:Following the code that you added in the previous step, add the following code to insert the contents of the file into the cache object as a CacheItem instance:

    cache.Set("filecontents", fileContents, policy)
    
    cache.Set("filecontents", fileContents, policy);
    

    Specificare le informazioni sulla modalità di eliminazione della voce della cache passando l'oggetto CacheItemPolicy creato in precedenza come parametro.You specify information about how the cache entry should be evicted by passing the CacheItemPolicy object that you created earlier as a parameter.

  11. Dopo il blocco if/then aggiungere il codice seguente per visualizzare il contenuto del file memorizzato nella cache in una finestra di messaggio:After the if/then block, add the following code to display the cached file content in a message box:

    MessageBox.Show(fileContents)
    
    MessageBox.Show(fileContents);
    
  12. Scegliere Compila WPFCaching dal menu Compila per compilare il progetto.In the Build menu, click Build WPFCaching to build your project.

Test della memorizzazione nella cache nell'applicazione WPFTesting Caching in the WPF Application

È ora possibile eseguire il test dell’applicazione.You can now test the application.

Per testare la memorizzazione nella cache nell'applicazione WPFTo test caching in the WPF application

  1. Premere CTRL+F5 per eseguire l'applicazione.Press CTRL+F5 to run the application.

    Viene visualizzata la finestra MainWindow.The MainWindow window is displayed.

  2. Fare clic su Ottieni cache.Click Get Cache.

    Il contenuto memorizzato nella cache del file di testo viene visualizzato in una finestra di messaggio.The cached content from the text file is displayed in a message box. Si noti il timestamp del file.Notice the timestamp on the file.

  3. Chiudere la finestra di messaggio e quindi fare di nuovo clic su Get cache .Close the message box and then click Get Cache again.

    Il timestamp è invariato.The timestamp is unchanged. Indica che viene visualizzato il contenuto memorizzato nella cache.This indicates the cached content is displayed.

  4. Attendere 10 secondi o più, quindi fare di nuovo clic su Ottieni cache .Wait 10 seconds or more and then click Get Cache again.

    Questa volta viene visualizzato un nuovo timestamp.This time a new timestamp is displayed. Ciò indica che i criteri consentono la scadenza della voce della cache e che viene visualizzato il nuovo contenuto memorizzato nella cache.This indicates that the policy let the cache entry expire and that new cached content is displayed.

  5. In un editor di testo aprire il file di testo creato.In a text editor, open the text file that you created. Non apportare alcuna modifica.Do not make any changes yet.

  6. Chiudere la finestra di messaggio e quindi fare di nuovo clic su Get cache .Close the message box and then click Get Cache again.

    Si noti di nuovo il timestamp.Notice the timestamp again.

  7. Apportare una modifica al file di testo e quindi salvare il file.Make a change to the text file and then save the file.

  8. Chiudere la finestra di messaggio e quindi fare di nuovo clic su Get cache .Close the message box and then click Get Cache again.

    Questa finestra di messaggio contiene il contenuto aggiornato del file di testo e un nuovo timestamp.This message box contains the updated content from the text file and a new timestamp. Ciò indica che il monitoraggio delle modifiche del file host ha rimosso la voce della cache immediatamente quando è stato modificato il file, anche se il periodo di timeout assoluto non è scaduto.This indicates that the host-file change monitor evicted the cache entry immediately when you changed the file, even though the absolute timeout period had not expired.

    Nota

    È possibile aumentare il tempo di rimozione a 20 secondi o più per consentire più tempo per apportare modifiche al file.You can increase the eviction time to 20 seconds or more to allow more time for you to make a change in the file.

Esempio di codiceCode Example

Al termine di questa procedura dettagliata, il codice per il progetto creato sarà simile all'esempio seguente.After you have completed this walkthrough, the code for the project you created will resemble the following example.

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 ancheSee also