Aracılığıyla paylaş


İzlenecek Yol: WPF Uygulamasında Uygulama Verilerini Önbelleğe Alma

Önbelleğe alma, hızlı erişim için verileri bellekte depolamanıza olanak tanır. Verilere yeniden erişildiğinde, uygulamalar verileri özgün kaynaktan almak yerine önbellekten alabilir. Bu, performansı ve ölçeklenebilirliği geliştirebilir. Ayrıca önbelleğe alma, veri kaynağı geçici olarak kullanılamadığında verileri kullanılabilir hale getirir.

.NET Framework, .NET Framework uygulamalarında önbelleğe almayı kullanmanızı sağlayan sınıflar sağlar. Bu sınıflar System.Runtime.Caching ad alanında bulunur.

Uyarı

System.Runtime.Caching ad alanı .NET Framework 4'te yenidir. Bu ad alanı, önbelleğe alma özelliğinin tüm .NET Framework uygulamalarında kullanılabilmesini sağlar. .NET Framework'ün önceki sürümlerinde önbelleğe alma yalnızca System.Web ad alanında kullanılabilirdi ve bu nedenle ASP.NET sınıflarına bağımlılık gerektiriyordu.

Bu izlenecek yol, .NET Framework'te bir Windows Presentation Foundation (WPF) uygulamasının parçası olarak kullanılabilen önbelleğe alma işlevinin nasıl kullanılacağını gösterir. İzlenecek yolda, bir metin dosyasının içeriğini önbelleğe alırsınız.

Bu kılavuzda gösterilen görevler şunlardır:

  • WPF uygulama projesi oluşturma.

  • .NET Framework 4'e referans ekleme.

  • Önbelleği başlatma.

  • Metin dosyasının içeriğini içeren bir önbellek girdisi ekleme.

  • Önbellek girdisi için bir tahliye politikası sağlama.

  • Önbelleğe alınan dosyanın yolunu izleme ve izlenen öğedeki değişiklikler hakkında önbellek örneğine bildirme.

Önkoşullar

Bu kılavuzu tamamlamak için şunlar gerekir:

  • Visual Studio 2010.

  • Az miktarda metin içeren bir metin dosyası. (Metin dosyasının içeriğini bir ileti kutusunda görüntülersiniz.) İzlenecek yolda gösterilen kod, aşağıdaki dosyayla çalıştığınızı varsayar:

    c:\cache\cacheText.txt

    Ancak, bu kılavuzda herhangi bir metin dosyasını kullanabilir ve kodda küçük değişiklikler yapabilirsiniz.

WPF Uygulama Projesi Oluşturma

Bir WPF uygulama projesi oluşturarak başlayacaksınız.

WPF uygulaması oluşturmak için

  1. Visual Studio'yu başlatın.

  2. Dosya menüsünde, Yeni'e tıklayın ve ardından Yeni Projeöğesine tıklayın.

    Yeni Proje iletişim kutusu görüntülenir.

  3. Yüklü Şablonlaraltında, kullanmak istediğiniz programlama dilini seçin ( Visual Basicveya Visual C#).

  4. yeni proje iletişim kutusunda WPF Uygulamasıöğesini seçin.

    Uyarı

    WPF Uygulaması şablonunu görmüyorsanız, WPF'yi destekleyen bir .NET Framework sürümünü hedeflediğinizden emin olun. Yeni Proje iletişim kutusunda listeden .NET Framework 4'i seçin.

  5. Adı metin kutusuna projeniz için bir ad girin. Örneğin, WPFCaching'i girebilirsiniz.

  6. Çözüm için dizin oluştur onay kutusunu seçin.

  7. Tamam'a tıklayın.

    WPF Tasarımcısı Tasarım görünümünde açılır ve MainWindow.xaml dosyasını görüntüler. Visual Studio, Projem klasörünü, Application.xaml dosyasını ve MainWindow.xaml dosyasını oluşturur.

.NET Framework'ü Hedefleme ve Önbelleğe Alma Derlemelerine Başvuru Ekleme

Varsayılan olarak, WPF uygulamaları .NET Framework 4 İstemci Profilini hedefler. WPF uygulamasında System.Runtime.Caching ad alanını kullanmak için uygulamanın .NET Framework 4'i (.NET Framework 4 İstemci Profili değil) hedeflemesi ve ad alanına bir başvuru içermesi gerekir.

Bu nedenle, sonraki adım .NET Framework hedefini değiştirmek ve System.Runtime.Caching ad alanına bir başvuru eklemektir.

Uyarı

.NET Framework hedefini değiştirme yordamı, Visual Basic projesinde ve Visual C# projesinde farklıdır.

Visual Basic'te hedef .NET Framework'ü değiştirmek için

  1. Çözüm Gezgini'nde proje adına sağ tıklayın ve ardından özellikleröğesine tıklayın.

    Uygulamanın özellikler penceresi görüntülenir.

  2. Derle sekmesine tıklayın.

  3. Pencerenin alt kısmında Gelişmiş Derleme Seçenekleri...tıklayın.

    Gelişmiş Derleyici Ayarları iletişim kutusu görüntülenir.

  4. Hedef çerçeve (tüm yapılandırmalar) listesinde .NET Framework 4'i seçin. (.NET Framework 4 İstemci Profili seçmeyin.)

  5. Tamam'a tıklayın.

    Hedef Çerçeve Değişikliği iletişim kutusu görüntülenir.

  6. Hedef Çerçeve Değişikliği iletişim kutusunda Evet'etıklayın.

    Proje kapatılır ve sonra yeniden açılır.

  7. Aşağıdaki adımları izleyerek önbelleğe alma derlemesine bir başvuru ekleyin:

    1. Çözüm Gezginiiçinde, projenin adına sağ tıklayın ve sonra Başvuru Ekleöğesine tıklayın.

    2. .NET sekmesini seçin, 'ı seçin ve ardından tamamtıklayın.

Visual C# projesinde hedef .NET Framework'leri değiştirmek için

  1. Çözüm Gezgini'nde proje adına sağ tıklayın ve ardından özellikleröğesine tıklayın.

    Uygulamanın özellikler penceresi görüntülenir.

  2. Uygulama sekmesine tıklayın.

  3. Hedef çerçeve listesinde .NET Framework 4'i seçin. (.NET Framework 4 İstemci Profili seçmeyin.)

  4. Aşağıdaki adımları izleyerek önbelleğe alma derlemesine bir başvuru ekleyin:

    1. Referanslar klasörüne sağ tıklayın ve Referans Ekleöğesine tıklayın.

    2. .NET sekmesini seçin, 'ı seçin ve ardından tamamtıklayın.

WPF Penceresine Düğme Ekleme

Ardından bir düğme denetimi ekleyecek ve düğmenin Click olayı için bir olay işleyicisi oluşturacaksınız. Daha sonra, düğmeye tıkladığınızda metin dosyasının içeriği önbelleğe alınacak ve görüntülenecek şekilde kod ekleyeceksiniz.

Düğme denetimi eklemek için

  1. Çözüm GezginiMainWindow.xaml dosyasına çift tıklayarak açın.

  2. Araç Kutusu'ndanOrtak WPF Denetimlerialtında, Button bir denetimi MainWindow penceresine sürükleyin.

  3. Özellikler penceresinde, Content denetiminin Button özelliğini Önbelleği Alolarak ayarlayın.

Önbelleği Başlatma ve Girdiyi Önbelleğe Alma

Ardından, aşağıdaki görevleri gerçekleştirmek için kodu ekleyebilirsiniz:

  • Önbellek sınıfının bir örneğini oluşturun; yani yeni bir MemoryCache nesnesi örneği oluşturursunuz.

  • Önbelleğin metin dosyasındaki değişiklikleri izlemek için bir HostFileChangeMonitor nesnesi kullandığını belirtin.

  • Metin dosyasını okuyun ve içeriğini önbellek girdisi olarak önbelleğe alın.

  • Önbelleğe alınan metin dosyasının içeriğini görüntüleyin.

Önbellek nesnesini oluşturmak için

  1. MainWindow.xaml.cs veya MainWindow.Xaml.vb dosyasında olay işleyicisi oluşturmak için yeni eklediğiniz düğmeye çift tıklayın.

  2. Dosyanın en üstüne (sınıf bildiriminden önce), aşağıdaki Imports (Visual Basic) veya using (C#) deyimlerini ekleyin:

    using System.Runtime.Caching;
    using System.IO;
    
    Imports System.Runtime.Caching
    Imports System.IO
    
  3. Olay işleyicisinde, önbellek nesnesinin örneğini başlatmak için aşağıdaki kodu ekleyin:

    ObjectCache cache = MemoryCache.Default;
    
    Dim cache As ObjectCache = MemoryCache.Default
    

    ObjectCache sınıfı, bellek içi nesne önbelleği sağlayan yerleşik bir sınıftır.

  4. filecontentsadlı önbellek girdisinin içeriğini okumak için aşağıdaki kodu ekleyin:

    Dim fileContents As String = TryCast(cache("filecontents"), String)
    
    string fileContents = cache["filecontents"] as string;
    
  5. filecontents adlı önbellek girişinin mevcut olup olmadığını denetlemek için aşağıdaki kodu ekleyin:

    If fileContents Is Nothing Then
    
    End If
    
    if (fileContents == null)
    {
    
    }
    

    Belirtilen önbellek girdisi yoksa, metin dosyasını okumanız ve önbelleğe önbellek girdisi olarak eklemeniz gerekir.

  6. if/then bloğuna aşağıdaki kodu ekleyerek önbellek girişinin süresinin 10 saniye sonra dolacağını belirten yeni bir CacheItemPolicy nesnesi oluşturun.

    Dim policy As New CacheItemPolicy()
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0)
    
    CacheItemPolicy policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0);
    

    Çıkarma veya süre sonu bilgisi sağlanmazsa, varsayılan değer InfiniteAbsoluteExpirationolur. Bu, önbellek girdilerinin hiçbir zaman yalnızca mutlak bir zamana bağlı olarak sona ermediği anlamına gelir. Bunun yerine, önbellek girdilerinin süresi yalnızca bellek baskısı olduğunda dolar. En iyi yöntem olarak, her zaman açıkça mutlak veya kayan süre sonu sağlamanız gerekir.

  7. if/then bloğunun içine ve önceki adımda eklediğiniz kodu izleyerek, izlemek istediğiniz dosya yolları için bir koleksiyon oluşturmak ve metin dosyasının yolunu koleksiyona eklemek için aşağıdaki kodu ekleyin:

    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");
    

    Uyarı

    Kullanmak istediğiniz metin dosyası c:\cache\cacheText.txtdeğilse, kullanmak istediğiniz metin dosyasının yolunu belirtin.

  8. Önceki adımda eklediğiniz kodun ardından, önbellek girdisinin değişiklik izleyicileri koleksiyonuna yeni bir HostFileChangeMonitor nesnesi eklemek için aşağıdaki kodu ekleyin:

    policy.ChangeMonitors.Add(New HostFileChangeMonitor(filePaths))
    
    policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
    

    HostFileChangeMonitor nesnesi metin dosyasının yolunu izler ve değişiklik olursa önbelleğe bildirir. Bu örnekte, dosyanın içeriği değişirse önbellek girdisinin süresi dolar.

  9. Önceki adımda eklediğiniz kodun ardından, metin dosyasının içeriğini okumak için aşağıdaki kodu ekleyin:

    fileContents = File.ReadAllText("c:\cache\cacheText.txt") & vbCrLf & DateTime.Now.ToString()
    
    fileContents = File.ReadAllText("c:\\cache\\cacheText.txt") + "\n" + DateTime.Now;
    

    Önbellek girişinin süresinin ne zaman dolacağını görebilmeniz için tarih ve saat zaman damgası eklenir.

  10. Önceki adımda eklediğiniz kodun ardından, dosyanın içeriğini önbellek nesnesine CacheItem örneği olarak eklemek için aşağıdaki kodu ekleyin:

    cache.Set("filecontents", fileContents, policy)
    
    cache.Set("filecontents", fileContents, policy);
    

    Daha önce oluşturduğunuz CacheItemPolicy nesnesini parametre olarak geçirerek önbellek girdisinin nasıl çıkarılacağı hakkında bilgi belirtirsiniz.

  11. if/then bloğundan sonra, önbelleğe alınan dosya içeriğini bir ileti kutusunda görüntülemek için aşağıdaki kodu ekleyin:

    MessageBox.Show(fileContents)
    
    MessageBox.Show(fileContents);
    
  12. Derleme menüsünde, projenizi oluşturmak için WPFCaching Oluştur'e tıklayın.

WPF Uygulamasında Önbelleğe Alma Testi

Artık uygulamayı test edebilirsiniz.

WPF uygulamasında önbelleğe almayı test etmek için

  1. Uygulamayı çalıştırmak için CTRL+F5 tuşlarına basın.

    MainWindow penceresi görüntülenir.

  2. öğesine tıklayın, önbelleği alın.

    Metin dosyasındaki önbelleğe alınan içerik bir ileti kutusunda görüntülenir. Dosyadaki zaman damgasına dikkat edin.

  3. İleti kutusunu kapatın ve sonra Önbelleği Al'e tekrar tıklayın.

    Zaman damgası değişmez. Bu, önbelleğe alınan içeriğin görüntülendiğini gösterir.

  4. 10 saniye veya daha fazla bekleyin ve ardından Önbelleği Al seçeneğine tekrar tıklayın.

    Bu kez yeni bir zaman damgası görüntülenir. Bu, politikanın önbellek girdisinin süresinin dolmasına izin verdiğini ve yeni önbelleğe alınmış içeriğin görüntülendiğini gösterir.

  5. Bir metin düzenleyicisinde, oluşturduğunuz metin dosyasını açın. Henüz herhangi bir değişiklik yapma.

  6. İleti kutusunu kapatın ve sonra Önbelleği Al'e tekrar tıklayın.

    Zaman damgasına yeniden dikkat edin.

  7. Metin dosyasında bir değişiklik yapın ve dosyayı kaydedin.

  8. İleti kutusunu kapatın ve sonra Önbelleği Al'e tekrar tıklayın.

    Bu ileti kutusu, metin dosyasındaki güncelleştirilmiş içeriği ve yeni bir zaman damgasını içerir. Bu, mutlak zaman aşımı süresi dolmamış olsa bile, dosyayı değiştirdiğinizde konak dosyası değişiklik izleyicisinin önbellek girdisini hemen çıkardığını gösterir.

    Uyarı

    Çıkarma süresini 20 saniyeye veya daha fazla artırarak dosyada değişiklik yapmanıza daha fazla zaman tanıyabilirsiniz.

Kod Örneği

Bu kılavuzu tamamladıktan sonra, oluşturduğunuz projenin kodu aşağıdaki örneğe benzer.

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

Ayrıca bakınız