快取可讓您將資料儲存在記憶體中,以進行快速存取。 重新存取資料時,應用程式可以從快取中取得資料,而不是從原始來源進行擷取。 這可以改善效能和延展性。 此外,暫時無法使用資料來源時,快取可讓資料可用。
.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 應用程式
啟動 Visual Studio。
在 [ 檔案 ] 功能表中,按兩下 [ [新增],然後按兩下 [ [新增專案]。
[新增專案] 對話方塊隨即出現。
在 [ 已安裝的範本下,選取您想要使用的程式設計語言(Visual Basic 或 Visual C#)。
在 [ 新增專案 ] 對話框中,選取 [ WPF 應用程式]。
備註
如果您沒有看到 WPF 應用程式 範本,請確定您是以支援 WPF 的 .NET Framework 版本為目標。 在 [ 新增專案 ] 對話方塊中,從列表中選取 [.NET Framework 4]。
在 [ 名稱 ] 文字框中,輸入項目的名稱。 例如,您可以輸入 WPFCaching。
選取 [為解決方案建立目錄] 核取方塊。
按一下 [確定]。
WPF 設計工具會在 設計 檢視中開啟,並顯示MainWindow.xaml 檔案。 Visual Studio 會建立 My Project 資料夾、Application.xaml 檔案和 MainWindow.xaml 檔案。
以 .NET Framework 為目標,並新增快取元件的參考
根據預設,WPF 應用程式會以 .NET Framework 4 用戶端配置檔為目標。 若要在 WPF 應用程式中使用 System.Runtime.Caching 命名空間,應用程式必須以 .NET Framework 4 為目標(而非 .NET Framework 4 用戶端配置檔),而且必須包含命名空間的參考。
因此,下一個步驟是變更 .NET Framework 目標,並將參考新增至 System.Runtime.Caching 命名空間。
備註
在 Visual Basic 專案和 Visual C# 專案中,變更 .NET Framework 目標的程式不同。
在 Visual Basic 中變更目標 .NET Framework
在 [ 方案總管]中,以滑鼠右鍵按兩下專案名稱,然後按兩下 [屬性] 。
應用程式的屬性視窗隨即顯示。
按一下 [編譯] 索引標籤。
在視窗底部,按兩下 [進階編譯選項…] 。
[進階編譯程式設定 ] 對話框隨即顯示 。
在 [ 目標 Framework (所有組態) 列表中,選取 [.NET Framework 4]。 (請勿選取 .NET Framework 4 用戶端配置檔。)
按一下 [確定]。
[目標 Framework 變更] 對話方塊隨即出現。
在 [ 目標 Framework 變更 ] 對話框中,按兩下 [是]。
專案已關閉,然後重新開啟。
依照下列步驟新增快取元件的參考:
在 [方案總管]中,以滑鼠右鍵按兩下項目的名稱,然後按一下 [新增參考]。
選取 [.NET] 索引標籤,選取
System.Runtime.Caching,然後按一下 [確定]。
變更 Visual C# 項目中的目標 .NET Framework
在 [方案總管]中,以滑鼠右鍵按一下專案名稱,然後按一下 [屬性]。
應用程式的屬性視窗隨即顯示。
按一下 [應用程式] 索引標籤。
在 [目標 Framework] 下拉式清單中選取 .NET Framework 4。 (請勿選取 .NET Framework 4 Client Profile。)
依照下列步驟新增快取元件的參考:
以滑鼠右鍵按一下 [參考] 資料夾,然後按一下 [加入參考...]。
選取 [.NET] 索引標籤,選取
System.Runtime.Caching,然後按一下 [確定]。
將按鈕新增至 WPF 視窗
接下來,您將新增按鈕控制項,並為按鈕的 Click 事件建立事件處理常式。 稍後您會將程式代碼新增至此 ,因此當您按下按鈕時,會快取並顯示文字文件的內容。
加入按鈕控制項
在 方案總管 中按兩下 MainPage.xaml 檔案以開啟它。
從 工具箱 的 一般 WPF 控制項 下,將一個
Button控制項拖曳至MainWindow視窗。在 屬性 視窗中,將
Button控件的Content屬性設定為 取得快取。
初始化快取和項目快取
接下來,您將新增程式碼以執行下列工作:
建立快取類別的執行個體,也就是您將具現化新的 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.DefaultObjectCache 類別屬於內建類別,可提供記憶體內部物件快取。
新增下列程式代碼,以讀取名為
filecontents的快取項目內容:Dim fileContents As String = TryCast(cache("filecontents"), String)string fileContents = cache["filecontents"] as string;新增下列程式碼,以檢查名為
filecontents的快取專案是否存在:If fileContents Is Nothing Then End Ifif (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 object 作為參數傳遞,來指定關於快取項目應如何逐出的資訊。
在
if/then區塊之後,加入以下程式碼以在訊息框中顯示快取的檔案內容:MessageBox.Show(fileContents)MessageBox.Show(fileContents);按一下 建置 功能表上的 建置 WPF 快取 來建置您的專案。
在 WPF 應用程式中測試快取
您現在可以測試該應用程式。
如需在 WPF 應用程式中測試快取
按 CTRL+F5 執行應用程式。
顯示
MainWindow視窗.點擊 取得快取。
文字檔的快取內容會顯示在訊息框中。 請注意檔案上的時間戳。
關閉訊息框,然後再次點擊 取得快取。
時間戳不會變更。 這表示快取內容已成功顯示。
等待 10 秒或更長時間,然後再次點擊 取得快取。
這次會顯示新的時間戳。 這表示原則已使快取專案過期,並顯示新的快取內容。
在文字編輯器中,開啟您建立的文字檔。 暫時不要進行任何變更。
關閉訊息框,然後再次點擊 取得快取。
請再次留意時間戳記。
對文字文件進行修改,然後保存該文件。
關閉訊息框,然後再次點擊 取得快取。
此訊息框包含來自文字檔的更新內容和新的時間戳記。 這表示當您更改文件時,主機文件變更監視器立即逐出了快取項目,即使絕對超時期限尚未到期。
備註
您可以將逐出時間增加到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