Пошаговое руководство. Кэширование данных приложения 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
Запустите Visual Studio.
В меню Файл выберите последовательно пункты Создать и Новый проект.
Откроется диалоговое окно Новый проект.
В разделе Установленные шаблоны выберите используемый язык программирования (Visual Basic или Visual C#).
В диалоговом окне Новый проект выберите Приложение WPF.
Примечание Если шаблон Приложение WPF отсутствует, убедитесь, что выбранная версия платформы .NET Framework поддерживает WPF.В диалоговом окне Новый проект выберите в списке значение .NET Framework 4.
В текстовом поле Имя введите имя проекта. Например, можно ввести WPFCaching.
Установите флажок Создать каталог для решения.
Нажмите кнопку ОК.
Откроется представление Проектирование конструктора 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
В обозревателе решений щелкните правой кнопкой мыши имя проекта и выберите пункт Свойства.
Откроется окно свойств для приложения.
Перейдите на вкладку Compile.
В нижней части окна нажмите кнопку Дополнительные параметры компиляции….
Откроется диалоговое окно Дополнительные параметры компилятора.
В списке Заданная исполняющая среда (все конфигурации) выберите значение .NET Framework 4 (не выбирайте значение Клиентский профиль .NET Framework 4).
Нажмите кнопку ОК.
Откроется диалоговое окно Изменение целевой рабочей среды.
В диалоговом окне Изменение целевой рабочей среды нажмите кнопку Да.
Проект будет закрыт и вновь открыт.
Добавьте ссылку на сборку кэширования, выполнив следующие действия.
В обозревателе решений щелкните правой кнопкой мыши имя проекта и выберите команду Добавить ссылку.
Перейдите на вкладку .NET, щелкните System.Runtime.Caching и нажмите кнопку ОК.
Изменение требуемой версии .NET Framework в Visual C#
В окне Обозреватель решений щелкните правой кнопкой мыши имя проекта и выберите пункт Свойства.
Откроется окно свойств для приложения.
Перейдите на вкладку Приложение.
В списке Требуемая версия .NET Framework выберите значение .NET Framework 4 (не выбирайте клиентский профиль .NET Framework 4).
Добавьте ссылку на сборку кэширования, выполнив следующие действия.
Щелкните правой кнопкой мыши папку Ссылки, а затем выберите команду Добавить ссылку.
Перейдите на вкладку .NET, щелкните System.Runtime.Caching и нажмите кнопку ОК.
Добавление кнопки в окно WPF
Далее необходимо добавить элемент управления "Кнопка" и создать обработчик событий Click для кнопки. Позже будет добавлен код, обеспечивающий кэширование и отображение содержимого текстового файла при нажатии кнопки.
Добавление элемента управления "Кнопка"
В обозревателе решений дважды щелкните файл MainWindow.xaml, чтобы открыть его.
Из группы Типовые элементы управления WPF панели элементов перетащите элемент управления Button в окно MainWindow.
В окне Свойства задайте для свойства Content элемента управления Button значение "Получить кэш".
Инициализация кэша и кэширование записи
Теперь будет добавлен код для выполнения следующих задач.
Создание экземпляра класса кэша (будет создан экземпляр нового объекта MemoryCache).
Указание того, что для отслеживания изменений в текстовом файле кэш использует объект HostFileChangeMonitor.
Чтение текстового файла и кэширование его содержимого в виде записи кэша.
Отображение содержимого кэшированного текстового файла.
Создание объекта кэша
Дважды нажмите только что созданную кнопку, чтобы создать обработчик событий в файле MainWindow.xaml.cs или MainWindow.Xaml.vb.
В верхней части файла (перед объявлением класса) добавьте указанные ниже операторы Imports (Visual Basic) или using (C#).
using System.Runtime.Caching; using System.IO;
Imports System.Runtime.Caching Imports System.IO
В обработчике событий добавьте следующий код для создания экземпляра объекта кэша:
ObjectCache cache = MemoryCache.Default;
Dim cache As ObjectCache = MemoryCache.Default
Класс ObjectCache — это встроенный класс, который предоставляет кэш объектов памяти.
Добавьте следующий код для чтения содержимого записи кэша с именем filecontents:
Dim fileContents As String = TryCast(cache("filecontents"), String)
string fileContents = cache["filecontents"] as string;
Добавьте следующий код для проверки наличия записи кэша с именем filecontents:
If fileContents Is Nothing Then End If
if (fileContents == null) { }
Если указанная запись кэша отсутствует, необходимо выполнить чтение текстового файла и добавить его в кэш в виде записи кэша.
В блоке 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, которое указывает, что срок действия записей кэша истекает не на основе абсолютного времени, а только при нехватке памяти. Рекомендуется всегда явно предоставлять абсолютный или скользящий срок действия.
Внутри блока 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, укажите путь к используемому текстовому файлу.
После кода, добавленного на предыдущем шаге, добавьте следующий код, чтобы добавить новый объект HostFileChangeMonitor в коллекцию мониторов изменений для записи кэша:
policy.ChangeMonitors.Add(New HostFileChangeMonitor(filePaths))
policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
Объект HostFileChangeMonitor отслеживает путь к текстовому файлу и при появлении изменений уведомляет кэш. В этом примере срок действия записи кэша истекает при изменении содержимого файла.
После кода, добавленного на предыдущем шаге, добавьте следующий код для чтения содержимого текстового файла:
fileContents = File.ReadAllText("c:\cache\cacheText.txt") & vbCrLf & DateTime.Now.ToString()
fileContents = File.ReadAllText("c:\\cache\\cacheText.txt") + + "\n" + DateTime.Now;
Отметка даты и времени добавляется для определения времени окончания срока действия записи кэша.
После кода, добавленного на предыдущем шаге, добавьте следующий код, чтобы вставить содержимое файла в объект кэша в качестве экземпляра CacheItem:
cache.Set("filecontents", fileContents, policy)
cache.Set("filecontents", fileContents, policy);
Сведения о способе удаления записи кэша задаются путем передачи ранее созданного объекта CacheItemPolicy в качестве параметра.
Добавьте после блока if/then следующий код, чтобы отобразить кэшированное содержимое файла в окне сообщения:
MessageBox.Show(fileContents)
MessageBox.Show(fileContents);
В меню Построение выберите команду Построить WPFCaching, чтобы выполнить построение проекта.
Проверка кэширования в приложении WPF
Теперь приложение можно протестировать.
Проверка кэширования в приложении WPF
Нажмите CTRL+F5, чтобы запустить приложение.
Откроется окно MainWindow.
Нажмите кнопку Получить кэш.
В окне сообщения отображается кэшированное содержимое текстового файла. Обратите внимание на отметку времени в файле.
Закройте окно сообщения и нажмите кнопку Получить кэш еще раз.
Отметка времени не изменилась. Это означает, что отображается кэшированное содержимое.
Подождите 10 секунд или более и снова нажмите кнопку Получить кэш.
Теперь отображается новая отметка времени. Это означает, что в силу политики срок действия кэша истек и отображается новое кэшированное содержимое.
Откройте созданный текстовый файл в текстовом редакторе. Пока не вносите никаких изменений.
Закройте окно сообщения и нажмите кнопку Получить кэш еще раз.
Снова обратите внимание на отметку времени.
Внесите изменение в текстовый файл и сохраните файл.
Закройте окно сообщения и нажмите кнопку Получить кэш еще раз.
В окне сообщения отображается обновленное содержимое текстового файла и новая отметка времени. Это означает, что монитор изменений основного файла удалил запись кэша сразу после внесения изменений, хотя абсолютный период срока действия еще не истек.
Примечание Время вытеснения можно увеличить до 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);
}
}
}