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 ad alanında System.Runtime.Caching bulunur.

Dekont

Ad System.Runtime.Caching 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 ad alanında System.Web 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 aşağıdakileri içerir:

  • WPF uygulama projesi oluşturma.

  • .NET Framework 4'e başvuru ekleme.

  • Önbelleği başlatma.

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

  • Önbellek girdisi için bir çıkarma ilkesi sağlama.

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

Ön koş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 çalıştırın.

  2. Dosya menüsünde Yeni'ye ve ardından Yeni Proje'ye tıklayın.

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

  3. Yüklü Şablonlar'ın altında, kullanmak istediğiniz programlama dilini seçin (Visual Basic veya Visual C#).

  4. Yeni Proje iletişim kutusunda WPF Uygulaması'nı seçin.

    Dekont

    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 WPF Önbelleğe Alma girebilirsiniz.

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

  7. Tamam'a tıklayın.

    WPF Tasarım Aracı 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'ün Hedeflenmesi ve Önbelleğe Alma Derlemelerine Başvuru Ekleme

Varsayılan olarak, WPF uygulamaları .NET Framework 4 İstemci Profilini hedefler. Bir WPF uygulamasında ad alanını System.Runtime.Caching 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 ad alanına bir başvuru System.Runtime.Caching eklemektir.

Dekont

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

Visual Basic'te 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'e tıklayın.

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

  2. Derle sekmesine tıklayın.

  3. Pencerenin en altında Gelişmiş Derleme Seçenekleri... seçeneğine 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'e tı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 Gezgini'da, projenin adına sağ tıklayın ve ardından Başvuru Ekle'ye tıklayın.

    2. .NET sekmesini seçin, öğesini seçin System.Runtime.Cachingve ardından Tamam'a tıklayın.

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

  1. Çözüm Gezgini'da proje adına sağ tıklayın ve ardından Özellikler'e 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. Başvurular klasörüne sağ tıklayın ve ardından Başvuru Ekle'ye tıklayın.

    2. .NET sekmesini seçin, öğesini seçin System.Runtime.Cachingve ardından Tamam'a tı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üğmesine tıkladığınızda metin dosyasının içeriği önbelleğe alınır ve görüntülenir.

Düğme denetimi eklemek için

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

  2. Araç Kutusu'ndan, Ortak WPF Denetimleri'nin altında bir Button denetimi pencereye MainWindow sürükleyin.

  3. Özellikler penceresinde denetimin ButtonContent özelliğini Önbellek Al olarak ayarlayın.

Önbelleği Başlatma ve Girdi Ö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 MemoryCache bir nesne örneği oluşturursunuz.

  • Önbelleğin metin dosyasındaki değişiklikleri izlemek için bir HostFileChangeMonitor nesne 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. adlı filecontentsö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. adlı filecontents önbellek girişinin var 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. bloğuna if/then aşağıdaki kodu ekleyerek önbellek girişinin süresinin 10 saniye sonra dolacağını belirten yeni CacheItemPolicy bir nesne 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 olur InfiniteAbsoluteExpiration. Bu, önbellek girdilerinin yalnızca mutlak bir süreye göre hiçbir zaman dolmaması 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. Bloğun if/then 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");
    

    Dekont

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

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

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

    Nesne, HostFileChangeMonitor metin dosyasının yolunu izler ve değişiklik olup olmadığını ö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 aşağıdaki kodu ekleyerek dosyanın içeriğini önbellek nesnesine örnek CacheItem olarak ekleyin:

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

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

  11. Bloğun if/then ardından, ö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. Oluştur menüsünde WPF Oluştur Önbelleğe Alma'a tıklayarak projenizi derleyin.

WPF Uygulamasında test Önbelleğe Alma

Artık uygulamayı test edebilirsiniz.

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

  1. Uygulamayı çalıştırmak için CTRL+F5'e basın.

    Pencere MainWindow görüntülenir.

  2. Önbelleği Al'a tıklayı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 önbelleği al'a yeniden 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'a yeniden tıklayın.

    Bu kez yeni bir zaman damgası görüntülenir. Bu, ilkenin önbellek girdisinin süresinin dolmasına izin 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 önbelleği al'a yeniden 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 önbelleği al'a yeniden 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.

    Dekont

    Çı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 bkz.