Поделиться через


Пошаговое руководство. Кэширование данных приложения в приложении WPF

Кэширование позволяет хранить данные в памяти для быстрого доступа. При повторном доступе к данным приложения могут получать данные из кэша, а не извлекать их из исходного источника. Это может повысить производительность и масштабируемость. Кроме того, кэширование делает данные доступными при временной недоступности источника данных.

Платформа .NET Framework предоставляет классы, позволяющие использовать кэширование в приложениях .NET Framework. Эти классы находятся в пространстве имен System.Runtime.Caching.

Заметка

Пространство имен System.Runtime.Caching новое в .NET Framework 4. Это пространство имен делает кэширование доступным для всех приложений .NET Framework. В предыдущих версиях .NET Framework кэширование было доступно только в пространстве имен System.Web и, следовательно, требуется зависимость от классов ASP.NET.

В этом пошаговом руководстве показано, как использовать функции кэширования, доступные в .NET Framework в рамках приложения Windows Presentation Foundation (WPF). В пошаговом руководстве вы кэшируете содержимое текстового файла.

Задачи, показанные в этом пошаговом руководстве, включают следующие:

  • Создание проекта приложения WPF.

  • Добавление ссылки на .NET Framework 4.

  • Инициализация кэша.

  • Добавление записи кэша, содержащей содержимое текстового файла.

  • Установка политики удаления для записи кэша.

  • Мониторинг пути кэшированного файла и уведомление экземпляра кэша об изменениях отслеживаемого элемента.

Необходимые условия

Для выполнения этого пошагового руководства вам потребуется:

  • Visual Studio 2010.

  • Текстовый файл, содержащий небольшой объем текста. (Содержимое текстового файла будет отображаться в поле сообщения.) Код, показанный в пошаговом руководстве, предполагает, что вы работаете со следующим файлом:

    c:\cache\cacheText.txt

    Однако вы можете использовать любой текстовый файл и внести небольшие изменения в код в этом пошаговом руководстве.

Создание проекта приложения WPF

Сначала создайте проект приложения WPF.

Создание приложения WPF

  1. Запустите Visual Studio.

  2. В меню Файл щелкните Создать, а затем щелкните Новый проект.

    Откроется диалоговое окно нового проекта.

  3. В разделе Установленные шаблонывыберите язык программирования (Visual Basic или Visual C#).

  4. В диалоговом окне Новый проект выберите WPF приложение.

    Заметка

    Если вы не видите шаблон приложения WPF, убедитесь, что вы нацелены на версию .NET Framework, поддерживающую WPF. В диалоговом окне Создание проекта выберите .NET Framework 4 из списка.

  5. В текстовом поле имя введите имя проекта. Например, можно ввести WPFCaching.

  6. Установите флажок Создать директорию для решения.

  7. Нажмите кнопку ОК.

    Конструктор WPF открывается в представлении конструктора и отображает файл MainWindow.xaml. Visual Studio создает папку My Project, файл Application.xaml и файл MainWindow.xaml.

Целевое назначение .NET Framework и добавление ссылки на элементы кэширования

По умолчанию приложения WPF предназначены для профиля клиента .NET Framework 4. Чтобы использовать пространство имен System.Runtime.Caching в приложении WPF, приложение должно использовать .NET Framework 4 (не профиль клиента .NET Framework 4) и должно содержать ссылку на пространство имен.

Поэтому следующим шагом является изменение целевого объекта .NET Framework и добавление ссылки на пространство имен System.Runtime.Caching.

Заметка

Процедура изменения целевого объекта .NET Framework отличается в проекте Visual Basic и в проекте Visual C#.

Изменение целевой платформы .NET Framework в Visual Basic

  1. В обозревателе решенийщелкните правой кнопкой мыши на имени проекта, а затем выберите Свойства.

    Откроется окно свойств приложения.

  2. Щёлкните вкладку Компиляция.

  3. В нижней части окна щелкните Дополнительные параметры компиляции....

    Откроется диалоговое окно расширенных параметров компилятора.

  4. В списке целевой платформы (все конфигурации) выберите .NET Framework 4. (Не выбирайте профиль клиента .NET Framework 4.)

  5. Нажмите кнопку ОК.

    Откроется диалоговое окно изменения целевой платформы .

  6. В диалоговом окне "Изменение целевой платформы" щелкните Да.

    Проект закрывается, а затем повторно открывается.

  7. Добавьте ссылку на сборку кэширования, выполнив следующие действия:

    1. В Проводнике решений щелкните правой кнопкой на имени проекта, а затем выберите Добавить ссылку.

    2. Перейдите на вкладку .NET, выберите System.Runtime.Cachingи нажмите кнопку ОК.

Изменение целевой платформы .NET Framework в проекте Visual C#

  1. В проводнике решенийщелкните правой кнопкой мыши имя проекта и выберите Свойства.

    Откроется окно свойств приложения.

  2. Нажмите на вкладку приложения.

  3. В списке целевой платформы выберите .NET Framework 4. (Не выбирайте .NET Framework 4 Клиентский профиль.)

  4. Добавьте ссылку на сборку кэширования, выполнив следующие действия:

    1. Щелкните правой кнопкой мыши папку Ссылки, затем выберите Добавить ссылку.

    2. Выберите вкладку .NET, выберите System.Runtime.Cachingи нажмите ОК.

Добавление кнопки в окно WPF

Затем вы добавите элемент управления кнопкой и создадите обработчик событий для события Click кнопки. Позже вы добавите код так, когда нажимаете кнопку, содержимое текстового файла кэшируется и отображается.

Добавление элемента управления кнопкой

  1. В обозревателе решенийдважды щелкните файл MainWindow.xaml, чтобы открыть его.

  2. Изпанели элементов в разделе Common WPF Controlsперетащите элемент управления в окно .

  3. В окне свойств задайте для свойства Content элемента управления Button значение Get Cache.

Инициализация кэша и кэширование записи

Затем вы добавите код для выполнения следующих задач:

  • Создайте экземпляр класса кэша, то есть создайте экземпляр нового объекта MemoryCache.

  • Укажите, что кэш использует объект HostFileChangeMonitor для отслеживания изменений в текстовом файле.

  • Считывает текстовый файл и кэширует его содержимое в виде записи кэша.

  • Отображение содержимого кэшированного текстового файла.

Создание объекта кэша

  1. Дважды щелкните только что добавленную кнопку, чтобы создать обработчик событий в файле MainWindow.xaml.cs или MainWindow.Xaml.vb.

  2. В верхней части файла (перед объявлением класса) добавьте следующие инструкции Imports (Visual Basic) или using (C#):

    using System.Runtime.Caching;
    using System.IO;
    
    Imports System.Runtime.Caching
    Imports System.IO
    
  3. В обработчике событий добавьте следующий код, чтобы создать экземпляр объекта кэша:

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

    Класс ObjectCache — это встроенный класс, который предоставляет кэш объектов в памяти.

  4. Добавьте следующий код для чтения содержимого записи кэша с именем filecontents:

    Dim fileContents As String = TryCast(cache("filecontents"), String)
    
    string fileContents = cache["filecontents"] as string;
    
  5. Добавьте следующий код, чтобы проверить, существует ли запись кэша с именем filecontents:

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

    Если указанная запись кэша не существует, необходимо прочитать текстовый файл и добавить его в качестве записи кэша в кэш.

  6. В блоке if/then добавьте следующий код, чтобы создать новый объект CacheItemPolicy, указывающий, что запись кэша истекает через 10 секунд.

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

    Если нет сведений о вытеснениях или истечении срока действия, значение по умолчанию InfiniteAbsoluteExpiration, что означает, что записи кэша никогда не истекают, основываясь только на абсолютном времени. Вместо этого срок действия записей кэша истекает только в случае нехватки памяти. Рекомендуется всегда явно предоставлять либо абсолютный, либо скользящий срок действия.

  7. В блоке if/then и после кода, добавленного на предыдущем шаге, добавьте следующий код, чтобы создать коллекцию для путей к файлам, которые требуется отслеживать, и добавить путь к текстовому файлу в коллекцию:

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

    Заметка

    Если используемый вами текстовый файл не является c:\cache\cacheText.txt, укажите путь к файлу, который вы хотите использовать.

  8. После того как вы добавили код на предыдущем шаге, добавьте следующий код, чтобы добавить новый объект HostFileChangeMonitor в коллекцию мониторов изменений для элемента кэша:

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

    Объект HostFileChangeMonitor отслеживает путь текстового файла и уведомляет кэш о том, происходят ли изменения. В этом примере запись кэша истекает, если содержимое файла изменяется.

  9. После добавленного на предыдущем шаге кода добавьте следующий код для чтения содержимого текстового файла:

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

    Добавлена метка времени и даты, чтобы увидеть, когда срок действия записи кэша истекает.

  10. После добавленного на предыдущем шаге кода добавьте следующий код, чтобы вставить содержимое файла в объект кэша в виде экземпляра CacheItem:

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

    Вы указываете сведения о том, как следует вытеснить запись кэша, передав объект CacheItemPolicy, созданный ранее в качестве параметра.

  11. После if/then блока добавьте следующий код, чтобы отобразить кэшированное содержимое файла в окне сообщения:

    MessageBox.Show(fileContents)
    
    MessageBox.Show(fileContents);
    
  12. В меню Сборка щелкните Создать WPFCaching для сборки вашего проекта.

Тестирование кэширования в приложении WPF

Теперь вы можете протестировать приложение.

Тестирование кэширования в приложении WPF

  1. Нажмите клавиши CTRL+F5, чтобы запустить приложение.

    Отображается окно MainWindow.

  2. Щелкните Получить кэш.

    Кэшированное содержимое из текстового файла отображается в окне сообщения. Обратите внимание на метку времени в файле.

  3. Закройте окно сообщения и снова кликните Получить кэш.

    Метка времени осталась неизменной. Это означает, что кэшированное содержимое отображается.

  4. Подождите 10 секунд или более, а затем снова нажмите , чтобы получить кэш.

    На этот раз отображается новая метка времени. Это означает, что политика позволила записи кэша истечь, и отображается новое кэшированное содержимое.

  5. В текстовом редакторе откройте созданный текстовый файл. Пока не вносите никаких изменений.

  6. Закройте поле сообщения и снова щелкните Получить кэш.

    Обратите внимание на метку времени еще раз.

  7. Внесите изменения в текстовый файл и сохраните его.

  8. Закройте поле сообщения и снова щелкните Получить кэш.

    Это поле сообщения содержит обновленное содержимое из текстового файла и новую метку времени. Это означает, что монитор изменений файла узла немедленно вытеснил запись кэша при изменении файла, несмотря на то, что абсолютный период времени ожидания не истек.

    Заметка

    Вы можете увеличить время вытеснения до 20 секунд или более, чтобы позволить вам внести изменения в файл.

Пример кода

После завершения этого пошагового руководства код созданного проекта будет выглядеть примерно так, как показано в следующем примере.

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

См. также