Wskazówki: przechowywanie w pamięci podręcznej danych aplikacji w aplikacji WPF
Buforowanie umożliwia przechowywanie danych w pamięci w celu uzyskania szybkiego dostępu. Po ponownym korzystaniu z danych aplikacje mogą pobierać dane z pamięci podręcznej zamiast pobierać je z oryginalnego źródła. Może to zwiększyć wydajność i skalowalność. Ponadto buforowanie udostępnia dane, gdy źródło danych jest tymczasowo niedostępne.
Program .NET Framework udostępnia klasy, które umożliwiają używanie buforowania w aplikacjach .NET Framework. Te klasy znajdują się w System.Runtime.Caching przestrzeni nazw.
Uwaga
System.Runtime.Caching Przestrzeń nazw jest nowa w programie .NET Framework 4. Ta przestrzeń nazw sprawia, że buforowanie jest dostępne dla wszystkich aplikacji .NET Framework. W poprzednich wersjach programu .NET Framework buforowanie było dostępne tylko w System.Web przestrzeni nazw i w związku z tym wymagało zależności od klas ASP.NET.
W tym przewodniku pokazano, jak używać funkcji buforowania, która jest dostępna w programie .NET Framework w ramach aplikacji Windows Presentation Foundation (WPF). W przewodniku buforujesz zawartość pliku tekstowego.
Zadania przedstawione w niniejszym przewodniku to m.in.:
Tworzenie projektu aplikacji WPF.
Dodawanie odwołania do programu .NET Framework 4.
Inicjowanie pamięci podręcznej.
Dodawanie wpisu pamięci podręcznej zawierającego zawartość pliku tekstowego.
Podanie zasad eksmisji dla wpisu pamięci podręcznej.
Monitorowanie ścieżki buforowanego pliku i powiadamianie wystąpienia pamięci podręcznej o zmianach w monitorowanym elemencie.
Wymagania wstępne
Aby ukończyć ten przewodnik, potrzebne są następujące elementy:
Visual Studio 2010.
Plik tekstowy zawierający niewielką ilość tekstu. (Zawartość pliku tekstowego zostanie wyświetlona w polu wiadomości). Kod przedstawiony w przewodniku zakłada, że pracujesz z następującym plikiem:
c:\cache\cacheText.txt
Można jednak użyć dowolnego pliku tekstowego i wprowadzić niewielkie zmiany w kodzie w tym przewodniku.
Tworzenie projektu aplikacji WPF
Rozpoczniesz od utworzenia projektu aplikacji WPF.
Aby utworzyć aplikację WPF
Uruchom program Visual Studio.
W menu Plik kliknij pozycję Nowy, a następnie kliknij pozycję Nowy projekt.
Zostanie wyświetlone okno dialogowe Nowy projekt .
W obszarze Zainstalowane szablony wybierz język programowania, którego chcesz użyć (Visual Basic lub Visual C#).
W oknie dialogowym Nowy projekt wybierz pozycję Aplikacja WPF.
Uwaga
Jeśli nie widzisz szablonu aplikacji WPF, upewnij się, że jest przeznaczona wersja programu .NET Framework, która obsługuje WPF. W oknie dialogowym Nowy projekt wybierz z listy pozycję .NET Framework 4.
W polu tekstowym Nazwa wprowadź nazwę projektu. Możesz na przykład wprowadzić WPF Buforowanie.
Zaznacz pole wyboru Utwórz katalog rozwiązania.
Kliknij przycisk OK.
Projektant WPF zostanie otwarty w widoku projektowym i zostanie wyświetlony plik MainWindow.xaml. Program Visual Studio tworzy folder Mój projekt , plik Application.xaml i plik MainWindow.xaml.
Określanie platformy .NET Framework i dodawanie odwołania do zestawów Buforowanie
Domyślnie aplikacje WPF są przeznaczone dla profilu klienta programu .NET Framework 4. Aby używać System.Runtime.Caching przestrzeni nazw w aplikacji WPF, aplikacja musi być skierowana do programu .NET Framework 4 (a nie profilu klienta programu .NET Framework 4) i musi zawierać odwołanie do przestrzeni nazw.
W związku z tym następnym krokiem jest zmiana docelowego programu .NET Framework i dodanie odwołania do System.Runtime.Caching przestrzeni nazw.
Uwaga
Procedura zmiany docelowego programu .NET Framework różni się w projekcie Visual Basic i w projekcie Visual C#.
Aby zmienić docelowy program .NET Framework w Visual Basic
W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy nazwę projektu, a następnie kliknij polecenie Właściwości.
Zostanie wyświetlone okno właściwości aplikacji.
Kliknij kartę Kompiluj.
W dolnej części okna kliknij pozycję Zaawansowane opcje kompilacji....
Zostanie wyświetlone okno dialogowe Zaawansowane Ustawienia kompilatora.
Na liście Platforma docelowa (wszystkie konfiguracje) wybierz pozycję .NET Framework 4. (Nie wybieraj profilu klienta programu .NET Framework 4).
Kliknij przycisk OK.
Zostanie wyświetlone okno dialogowe Zmiana struktury docelowej.
W oknie dialogowym Zmiana struktury docelowej kliknij przycisk Tak.
Projekt zostanie zamknięty i zostanie ponownie otwarty.
Dodaj odwołanie do zestawu buforowania, wykonując następujące kroki:
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy nazwę projektu, a następnie kliknij polecenie Dodaj odwołanie.
Wybierz kartę .NET , wybierz pozycję
System.Runtime.Caching
, a następnie kliknij przycisk OK.
Aby zmienić docelowy program .NET Framework w projekcie Visual C#
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy nazwę projektu, a następnie kliknij polecenie Właściwości.
Zostanie wyświetlone okno właściwości aplikacji.
Kliknij kartę Aplikacja .
Na liście Platforma docelowa wybierz pozycję .NET Framework 4. (Nie wybieraj profilu klienta programu .NET Framework 4).
Dodaj odwołanie do zestawu buforowania, wykonując następujące kroki:
Kliknij prawym przyciskiem myszy folder Odwołania , a następnie kliknij polecenie Dodaj odwołanie.
Wybierz kartę .NET , wybierz pozycję
System.Runtime.Caching
, a następnie kliknij przycisk OK.
Dodawanie przycisku do okna WPF
Następnie dodasz kontrolkę przycisku i utworzysz procedurę obsługi zdarzeń dla zdarzenia przycisku Click
. Później dodasz kod, aby po kliknięciu przycisku zawartość pliku tekstowego została buforowana i wyświetlana.
Aby dodać kontrolkę przycisku
W Eksplorator rozwiązań kliknij dwukrotnie plik MainWindow.xaml, aby go otworzyć.
Z przybornika w obszarze Wspólne kontrolki WPF przeciągnij kontrolkę
Button
doMainWindow
okna.W oknie Właściwości ustaw
Content
właściwość kontrolkiButton
na Pobierz pamięć podręczną.
Inicjowanie pamięci podręcznej i Buforowanie wpisu
Następnie dodasz kod, aby wykonać następujące zadania:
Utwórz wystąpienie klasy pamięci podręcznej — oznacza to, że utworzysz wystąpienie nowego MemoryCache obiektu.
Określ, że pamięć podręczna HostFileChangeMonitor używa obiektu do monitorowania zmian w pliku tekstowym.
Odczytaj plik tekstowy i buforuj jego zawartość jako wpis pamięci podręcznej.
Wyświetl zawartość buforowanego pliku tekstowego.
Aby utworzyć obiekt pamięci podręcznej
Kliknij dwukrotnie dodany przycisk, aby utworzyć procedurę obsługi zdarzeń w pliku MainWindow.xaml.cs lub MainWindow.Xaml.vb.
W górnej części pliku (przed deklaracją klasy) dodaj następujące
Imports
instrukcje (Visual Basic) lubusing
(C#):using System.Runtime.Caching; using System.IO;
Imports System.Runtime.Caching Imports System.IO
W procedurze obsługi zdarzeń dodaj następujący kod, aby utworzyć wystąpienie obiektu pamięci podręcznej:
ObjectCache cache = MemoryCache.Default;
Dim cache As ObjectCache = MemoryCache.Default
Klasa ObjectCache jest wbudowaną klasą, która zapewnia pamięć podręczną obiektów w pamięci.
Dodaj następujący kod, aby odczytać zawartość wpisu pamięci podręcznej o nazwie
filecontents
:Dim fileContents As String = TryCast(cache("filecontents"), String)
string fileContents = cache["filecontents"] as string;
Dodaj następujący kod, aby sprawdzić, czy wpis pamięci podręcznej o nazwie
filecontents
istnieje:If fileContents Is Nothing Then End If
if (fileContents == null) { }
Jeśli określony wpis pamięci podręcznej nie istnieje, musisz odczytać plik tekstowy i dodać go jako wpis pamięci podręcznej do pamięci podręcznej.
if/then
W bloku dodaj następujący kod, aby utworzyć nowy CacheItemPolicy obiekt, który określa, że wpis pamięci podręcznej wygasa po 10 sekundach.Dim policy As New CacheItemPolicy() policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0)
CacheItemPolicy policy = new CacheItemPolicy(); policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0);
Jeśli nie podano żadnych informacji o eksmisji lub wygaśnięciu, wartość domyślna to InfiniteAbsoluteExpiration, co oznacza, że wpisy pamięci podręcznej nigdy nie wygasają na podstawie bezwzględnego czasu. Zamiast tego wpisy pamięci podręcznej wygasają tylko wtedy, gdy występuje wykorzystanie pamięci. Najlepszym rozwiązaniem jest zawsze jawne podanie bezwzględnego lub przesuwanego wygaśnięcia.
if/then
Wewnątrz bloku i po kodzie dodanym w poprzednim kroku dodaj następujący kod, aby utworzyć kolekcję dla ścieżek plików, które chcesz monitorować, i dodać ścieżkę pliku tekstowego do kolekcji: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");
Uwaga
Jeśli plik tekstowy, którego chcesz użyć, to nie
c:\cache\cacheText.txt
, określ ścieżkę, w której ma być używany plik tekstowy.Po kodzie dodanym w poprzednim kroku dodaj następujący kod, aby dodać nowy HostFileChangeMonitor obiekt do kolekcji monitorów zmian dla wpisu pamięci podręcznej:
policy.ChangeMonitors.Add(New HostFileChangeMonitor(filePaths))
policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
Obiekt HostFileChangeMonitor monitoruje ścieżkę pliku tekstowego i powiadamia pamięć podręczną, jeśli wystąpią zmiany. W tym przykładzie wpis pamięci podręcznej wygaśnie, jeśli zawartość pliku ulegnie zmianie.
Po kodzie dodanym w poprzednim kroku dodaj następujący kod, aby odczytać zawartość pliku tekstowego:
fileContents = File.ReadAllText("c:\cache\cacheText.txt") & vbCrLf & DateTime.Now.ToString()
fileContents = File.ReadAllText("c:\\cache\\cacheText.txt") + "\n" + DateTime.Now;
Dodawana jest sygnatura czasowa daty i godziny, dzięki czemu będzie można zobaczyć, kiedy wpis pamięci podręcznej wygaśnie.
Po kodzie dodanym w poprzednim kroku dodaj następujący kod, aby wstawić zawartość pliku do obiektu pamięci podręcznej jako CacheItem wystąpienie:
cache.Set("filecontents", fileContents, policy)
cache.Set("filecontents", fileContents, policy);
Należy określić informacje na temat sposobu eksmitowania wpisu pamięci podręcznej przez przekazanie CacheItemPolicy obiektu utworzonego wcześniej jako parametru.
if/then
Po bloku dodaj następujący kod, aby wyświetlić zawartość pliku w pamięci podręcznej w polu komunikatu:MessageBox.Show(fileContents)
MessageBox.Show(fileContents);
W menu Kompilacja kliknij pozycję KompilujWPF Buforowanie aby skompilować projekt.
Testowanie Buforowanie w aplikacji WPF
Teraz możesz przetestować aplikację.
Aby przetestować buforowanie w aplikacji WPF
Naciśnij klawisze CTRL+F5, aby uruchomić aplikację.
Zostanie
MainWindow
wyświetlone okno.Kliknij pozycję Pobierz pamięć podręczną.
Zawartość buforowana z pliku tekstowego jest wyświetlana w polu komunikatu. Zwróć uwagę na znacznik czasu w pliku.
Zamknij okno komunikatu, a następnie ponownie kliknij pozycję Pobierz pamięć podręczną .
Sygnatura czasowa nie zmienia się. Oznacza to, że jest wyświetlana buforowana zawartość.
Poczekaj 10 sekund lub więcej, a następnie ponownie kliknij pozycję Pobierz pamięć podręczną .
Tym razem zostanie wyświetlony nowy znacznik czasu. Oznacza to, że zasady pozwalają na wygaśnięcie wpisu pamięci podręcznej i wyświetlenie nowej buforowanej zawartości.
W edytorze tekstów otwórz utworzony plik tekstowy. Nie wprowadzaj jeszcze żadnych zmian.
Zamknij okno komunikatu, a następnie ponownie kliknij pozycję Pobierz pamięć podręczną .
Zwróć uwagę na znacznik czasu ponownie.
Wprowadź zmianę w pliku tekstowym, a następnie zapisz plik.
Zamknij okno komunikatu, a następnie ponownie kliknij pozycję Pobierz pamięć podręczną .
To pole komunikatu zawiera zaktualizowaną zawartość z pliku tekstowego i nowy znacznik czasu. Oznacza to, że monitor zmian pliku hosta eksmitował wpis pamięci podręcznej natychmiast po zmianie pliku, mimo że bezwzględny okres przekroczenia limitu czasu nie wygasł.
Uwaga
Możesz zwiększyć czas eksmisji do 20 sekund lub więcej, aby umożliwić więcej czasu na wprowadzenie zmiany w pliku.
Przykład kodu
Po ukończeniu tego przewodnika kod utworzonego projektu będzie podobny do poniższego przykładu.
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
Zobacz też
.NET Desktop feedback