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

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

В платформе .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 (все конфигурации) выберите ".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 значение 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

См. также