共用方式為


逐步解說:在 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。

  • 初始化快取。

  • 加入包含文字文件內容的快取專案。

  • 提供快取專案的收回原則。

  • 監視快取檔案的路徑,並通知快取實例對受監視專案所做的變更。

必要條件

為了完成這個逐步解說,您需要:

  • Visual Studio 2010。

  • 包含少量文字的文字檔。 (您會在訊息框中顯示文字文件的內容。)逐步解說中說明的程式代碼假設您使用下列檔案:

    c:\cache\cacheText.txt

    不過,您可以使用任何文本檔,並在此逐步解說中對程式碼進行小變更。

建立 WPF 應用程式專案

您將從建立 WPF 應用程式項目開始。

建立 WPF 應用程式

  1. 啟動 Visual Studio。

  2. 在 [ 檔案 ] 功能表中,按兩下 [ [新增],然後按兩下 [ [新增專案]

    [新增專案] 對話方塊隨即出現。

  3. 在 [ 已安裝的範本下,選取您想要使用的程式設計語言(Visual BasicVisual C#)。

  4. 在 [ 新增專案 ] 對話框中,選取 [ WPF 應用程式]

    注意

    如果您沒有看到 WPF 應用程式 範本,請確定您是以支援 WPF 的 .NET Framework 版本為目標。 在 [ 新增專案 ] 對話方塊中,從列表中選取 [.NET Framework 4]。

  5. 在 [ 名稱 ] 文字框中,輸入項目的名稱。 例如,您可以輸入 WPFCaching

  6. 選取 [為解決方案建立目錄] 核取方塊。

  7. 按一下 [確定]

    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

  1. 在 [ 方案總管]中,以滑鼠右鍵按兩下專案名稱,然後按兩下 [屬性] 。

    應用程式的屬性視窗隨即顯示。

  2. 按一下 [編譯] 索引標籤。

  3. 在視窗底部,按兩下 [進階編譯選項…] 。

    [進階編譯程式設定 ] 對話框隨即顯示 。

  4. 在 [ 目標 Framework (所有組態) 列表中,選取 [.NET Framework 4]。 (請勿選取 .NET Framework 4 用戶端配置檔。)

  5. 按一下 [確定]

    [目標 Framework 變更] 對話方塊隨即出現。

  6. 在 [ 目標 Framework 變更 ] 對話框中,按兩下 [是]

    專案已關閉,然後重新開啟。

  7. 依照下列步驟新增快取元件的參考:

    1. [方案總管]中,以滑鼠右鍵按兩下項目的名稱,然後按一下 [新增參考]

    2. 選取 [.NET] 索引標籤,選取 System.Runtime.Caching,然後按一下 [確定]

變更 Visual C# 項目中的目標 .NET Framework

  1. [方案總管]中,以滑鼠右鍵按一下專案名稱,然後按一下 [屬性]

    應用程式的屬性視窗隨即顯示。

  2. 按一下 [應用程式] 索引標籤。

  3. 在 [目標 Framework] 下拉式清單中選取 .NET Framework 4。 (請勿選取 .NET Framework 4 Client Profile。)

  4. 依照下列步驟新增快取元件的參考:

    1. 以滑鼠右鍵按一下 [參考] 資料夾,然後按一下 [加入參考...]

    2. 選取 [.NET] 索引標籤,選取 System.Runtime.Caching,然後按一下 [確定]

將按鈕新增至 WPF 視窗

接下來,您將新增按鈕控制項,並為按鈕的 Click 事件建立事件處理常式。 稍後您會將程式代碼新增至此 ,因此當您按下按鈕時,會快取並顯示文字文件的內容。

加入按鈕控制項

  1. 方案總管 中按兩下 MainPage.xaml 檔案以開啟它。

  2. 工具箱一般 WPF 控制項 下,將一個 Button 控制項拖曳至 MainWindow 視窗。

  3. 屬性 視窗中,將 Button 控件的 Content 屬性設定為 取得快取

初始化快取和項目快取

接下來,您將新增程式碼以執行下列工作:

  • 建立快取類別的執行個體,也就是您將具現化新的 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 object 作為參數傳遞,來指定關於快取項目應如何逐出的資訊。

  11. if/then 區塊之後,加入以下程式碼以在訊息框中顯示快取的檔案內容:

    MessageBox.Show(fileContents)
    
    MessageBox.Show(fileContents);
    
  12. 按一下 建置 功能表上的 建置 WPF 快取 來建置您的專案。

在 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

另請參閱