Genomgång av hur man cachelagrar programdata i ett WPF-program

Med cachelagring kan du lagra data i minnet för snabb åtkomst. När data används igen kan program hämta data från cacheminnet i stället för att hämta dem från den ursprungliga källan. Detta kan förbättra prestanda och skalbarhet. Dessutom gör cachelagring data tillgängliga när datakällan är tillfälligt otillgänglig.

.NET Framework innehåller klasser som gör att du kan använda cachelagring i .NET Framework-program. Dessa klasser finns i System.Runtime.Caching namnområdet.

Anmärkning

Namnområdet System.Runtime.Caching är nytt i .NET Framework 4. Det här namnområdet gör cachelagring tillgänglig för alla .NET Framework-program. I tidigare versioner av .NET Framework var cachelagring endast tillgängligt i System.Web namnområdet och krävde därför ett beroende av ASP.NET klasser.

Den här genomgången visar hur du använder cachelagringsfunktionerna som är tillgängliga i .NET Framework som en del av ett WPF-program (Windows Presentation Foundation). I genomgången cachelagrade du innehållet i en textfil.

Uppgifter som illustreras i den här guiden innehåller följande:

  • Skapa ett WPF-programprojekt.

  • Lägga till en referens till .NET Framework 4.

  • Initierar en cache.

  • Lägga till en cachepost som innehåller innehållet i en textfil.

  • Tillhandahålla en utkastningspolicy för cacheposten.

  • Övervaka sökvägen till den cachelagrade filen och meddela cacheinstansen om ändringar i det övervakade objektet.

Förutsättningar

För att slutföra den här genomgången behöver du:

  • Visual Studio 2010.

  • En textfil som innehåller en liten mängd text. (Du visar innehållet i textfilen i en meddelanderuta.) Koden som illustreras i genomgången förutsätter att du arbetar med följande fil:

    c:\cache\cacheText.txt

    Du kan dock använda valfri textfil och göra små ändringar i koden i den här genomgången.

Skapa ett WPF-programprojekt

Du börjar med att skapa ett WPF-programprojekt.

Skapa ett WPF-program

  1. Starta Visual Studio.

  2. I menyn Arkiv klickar du på Nytt och sedan på Nytt projekt.

    Dialogrutan Nytt projekt visas.

  3. Under Installerade mallar väljer du det programmeringsspråk som du vill använda (Visual Basic eller Visual C#).

  4. I dialogrutan Nytt projekt väljer du WPF-program.

    Anmärkning

    Om du inte ser WPF-programmallen, kontrollera att du siktar på en version av .NET Framework som stöder WPF. I dialogrutan Nytt projekt väljer du .NET Framework 4 i listan.

  5. I textrutan Namn anger du ett namn för projektet. Du kan till exempel ange WPFCaching.

  6. Markera kryssrutan Skapa katalog för lösning .

  7. Klicka på OK.

    WPF Designer öppnas i designvyn och visar filen MainWindow.xaml. Visual Studio skapar mappen Mitt projekt , filen Application.xaml och filen MainWindow.xaml.

Rikta in sig på .NET Framework och lägga till en referens till cachelagringssammansättningarna

Som standard är WPF-program inriktade på .NET Framework 4-klientprofilen. Om du vill använda System.Runtime.Caching namnområdet i ett WPF-program måste programmet rikta in sig på .NET Framework 4 (inte .NET Framework 4-klientprofilen) och måste innehålla en referens till namnområdet.

Nästa steg är därför att ändra .NET Framework-målet och lägga till en referens till System.Runtime.Caching namnområdet.

Anmärkning

Proceduren för att ändra .NET Framework-målet skiljer sig i ett Visual Basic-projekt och i ett Visual C#-projekt.

Så här ändrar du .NET Framework-målet i Visual Basic

  1. Högerklicka på projektnamnet i Solutions Explorer och klicka sedan på Egenskaper.

    Egenskapsfönstret för programmet visas.

  2. Klicka på fliken Kompilera.

  3. Längst ned i fönstret klickar du på Avancerade kompileringsalternativ....

    Dialogrutan Inställningar för avancerad kompilator visas.

  4. I listan Målramverk (alla konfigurationer) väljer du .NET Framework 4. (Välj inte .NET Framework 4-klientprofil.)

  5. Klicka på OK.

    Dialogrutan Ändra målramverk visas.

  6. I dialogrutan Ändra målramverk klickar du på Ja.

    Projektet stängs och öppnas sedan igen.

  7. Lägg till en referens till cachelagringssammansättningen genom att följa dessa steg:

    1. Högerklicka på projektets namn i Solution Explorer och klicka sedan på Lägg till referens.

    2. Välj fliken .NET , välj System.Runtime.Cachingoch klicka sedan på OK.

Så här ändrar du .NET Framework-målet i ett Visual C#-projekt

  1. Högerklicka på projektnamnet i Solution Explorer och klicka sedan på Egenskaper.

    Egenskapsfönstret för programmet visas.

  2. Klicka på fliken Program .

  3. I listan Målramverk väljer du .NET Framework 4. (Välj inte .NET Framework 4-klientprofil.)

  4. Lägg till en referens till cachelagringssammansättningen genom att följa dessa steg:

    1. Högerklicka på mappen Referenser och klicka sedan på Lägg till referens.

    2. Välj fliken .NET , välj System.Runtime.Cachingoch klicka sedan på OK.

Lägga till en knapp i WPF-fönstret

Därefter lägger du till en knappkontroll och skapar en händelsehanterare för knappens Click händelse. Senare kommer du att lägga till kod så att när du klickar på knappen, cachas och visas innehållet i textfilen.

Så här lägger du till en knappkontroll

  1. Dubbelklicka på filen MainWindow.xaml i Solution Explorer för att öppna den.

  2. Dra en kontroll till fönstret under Vanliga WPF-kontroller i ButtonMainWindow.

  3. I fönstret Egenskaper anger du Content egenskapen för Button kontrollen till Hämta cache.

Initiera cachen och cachelagra en post

Därefter lägger du till koden för att utföra följande uppgifter:

  • Skapa en instans av cacheklassen, dvs. du instansierar ett nytt MemoryCache objekt.

  • Ange att cachen använder ett HostFileChangeMonitor objekt för att övervaka ändringar i textfilen.

  • Läs textfilen och cachelagra dess innehåll som en cache-entry.

  • Visa innehållet i den cachelagrade textfilen.

Så här skapar du cacheobjektet

  1. Dubbelklicka på knappen som du nyss lade till för att skapa en händelsehanterare i filen MainWindow.xaml.cs eller MainWindow.Xaml.vb.

  2. Överst i filen (före klassdeklarationen) lägger du till följande Imports (Visual Basic) eller using (C#)-instruktioner:

    using System.Runtime.Caching;
    using System.IO;
    
    Imports System.Runtime.Caching
    Imports System.IO
    
  3. I händelsehanteraren lägger du till följande kod för att instansiera cacheobjektet:

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

    Klassen ObjectCache är en inbyggd klass som tillhandahåller ett minnesinternt objektcacheminne.

  4. Lägg till följande kod för att läsa innehållet i en cachepost med namnet filecontents:

    Dim fileContents As String = TryCast(cache("filecontents"), String)
    
    string fileContents = cache["filecontents"] as string;
    
  5. Lägg till följande kod för att kontrollera om cacheposten med namnet filecontents finns:

    If fileContents Is Nothing Then
    
    End If
    
    if (fileContents == null)
    {
    
    }
    

    Om den angivna cacheposten inte finns måste du läsa textfilen och lägga till den som en cachepost i cacheminnet.

  6. I blocket if/then lägger du till följande kod för att skapa ett nytt CacheItemPolicy objekt som anger att cacheposten upphör att gälla efter 10 sekunder.

    Dim policy As New CacheItemPolicy()
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0)
    
    CacheItemPolicy policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0);
    

    Om ingen borttagnings- eller förfalloinformation anges är InfiniteAbsoluteExpirationstandardvärdet , vilket innebär att cacheposterna aldrig upphör att gälla baserat på en absolut tid. Cacheposter upphör i stället endast att gälla när minnesbelastning uppstår. Som bästa praxis bör du alltid uttryckligen ange antingen en absolut eller en glidande förfallotid.

  7. I blocket if/then och efter koden som du lade till i föregående steg lägger du till följande kod för att skapa en samling för de filsökvägar som du vill övervaka och för att lägga till sökvägen till textfilen i samlingen:

    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");
    

    Anmärkning

    Om textfilen du vill använda inte c:\cache\cacheText.txtär anger du den sökväg där textfilen ska användas.

  8. Efter koden som du lade till i föregående steg lägger du till följande kod för att lägga till ett nytt HostFileChangeMonitor objekt i samlingen med ändringsövervakare för cacheposten:

    policy.ChangeMonitors.Add(New HostFileChangeMonitor(filePaths))
    
    policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
    

    Objektet HostFileChangeMonitor övervakar textfilens sökväg och meddelar cacheminnet om ändringar sker. I detta exempel kommer cacheposten att gå ut om innehållet i filen ändras.

  9. Efter koden som du lade till i föregående steg lägger du till följande kod för att läsa innehållet i textfilen:

    fileContents = File.ReadAllText("c:\cache\cacheText.txt") & vbCrLf & DateTime.Now.ToString()
    
    fileContents = File.ReadAllText("c:\\cache\\cacheText.txt") + "\n" + DateTime.Now;
    

    Tidsstämpeln för datum och tid läggs till så att du kan se när cacheposten upphör att gälla.

  10. Efter koden som du lade till i föregående steg lägger du till följande kod för att infoga innehållet i filen i cacheobjektet som en CacheItem instans:

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

    Du anger information om hur cacheposten ska avlägsnas genom att skicka objektet CacheItemPolicy som du skapade tidigare som en parameter.

  11. if/then Efter blocket lägger du till följande kod för att visa det cachelagrade filinnehållet i en meddelanderuta:

    MessageBox.Show(fileContents)
    
    MessageBox.Show(fileContents);
    
  12. I menyn Skapa klickar du på Skapa WPFCaching för att skapa projektet.

Testa cachelagring i WPF-programmet

Nu kan du testa programmet.

Testa cachelagring i WPF-programmet

  1. Tryck på CTRL+F5 för att köra programmet.

    Fönstret MainWindow visas.

  2. Klicka på Hämta cache.

    Det cachelagrade innehållet från textfilen visas i en meddelanderuta. Observera tidsstämpeln för filen.

  3. Stäng meddelanderutan och klicka sedan på Hämta cacheminne igen.

    Tidsstämpeln är oförändrad. Detta anger att det cachelagrade innehållet visas.

  4. Vänta 10 sekunder eller mer och klicka sedan på Hämta cache igen.

    Den här gången visas en ny tidsstämpel. Detta anger att principen tillåter att cacheposten upphör att gälla och att nytt cachelagrat innehåll visas.

  5. Öppna textfilen som du skapade i en textredigerare. Gör inga ändringar än.

  6. Stäng meddelanderutan och klicka sedan på Hämta cacheminne igen.

    Lägg märke till tidsstämpeln igen.

  7. Gör en ändring i textfilen och spara sedan filen.

  8. Stäng meddelanderutan och klicka sedan på Hämta cacheminne igen.

    Den här meddelanderutan innehåller det uppdaterade innehållet från textfilen och en ny tidsstämpel. Detta indikerar att övervakaren för ändring av värdfil avlägsnade cacheposten omedelbart när du ändrade filen, även om den absoluta tidsgränsperioden inte hade upphört att gälla.

    Anmärkning

    Du kan öka borttagningstiden till 20 sekunder eller mer för att ge dig mer tid att göra en ändring i filen.

Kodexempel

När du har slutfört den här genomgången liknar koden för projektet du skapade följande exempel.

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

Se även