Пошаговое руководство. Кэширование данных приложения 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.

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

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

  • Реализация политики вытеснения записи кэша.

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

Обязательные компоненты

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

  • Microsoft 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 создает папку Мой проект и файлы 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. Перейдите на вкладку Compile.

  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 выберите значение .NET Framework 4 (не выбирайте клиентский профиль .NET Framework 4).

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

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

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

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

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

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

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

  2. Из группы Типовые элементы управления WPF панели элементов перетащите элемент управления Button в окно MainWindow.

  3. В окне Свойства задайте для свойства Content элемента управления Button значение "Получить кэш".

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

Теперь будет добавлен код для выполнения следующих задач.

  • Создание экземпляра класса кэша (будет создан экземпляр нового объекта 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 секунд или более, чтобы было больше времени для внесения изменений в файл.

Пример кода

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

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


        }
    }
}

См. также

Ссылки

MemoryCache

ObjectCache

System.Runtime.Caching

Основные понятия

Кэширование в приложениях платформы .NET Framework