Windows Presentation Foundation veri bağlantısı'nı kullandığınızda bellek sızıntısı oluşabilir

Makale çevirileri Makale çevirileri
Makale numarası: 938416 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Belirtiler

Microsoft Windows Presentation Foundation (WPF) veri bağlama'ı kullandığınızda bellek sızıntısı oluşabilir.

Neden

Bu sorun, aşağıdaki koşullar geçerli olursa oluşur:
  • Veri bağlama yolu PX nesnesinin özelliğine başvuruyor.
  • X nesnesini, doğrudan bir başvuru ya da hedef veri bağlama işlemi, dolaylı bir başvuru içerir.
  • <a1>Özellik</a1> PDependencyProperty bir nesne veya Propertyınfo nesnesi yerine bir PropertyDescriptor nesnesi yoluyla erişilir.

Pratik Çözüm

Bu soruna geçici bir çözüm için aşağıdaki yöntemlerden birini kullanın.

Yöntem 1

<a1>Özellik</a1> PDependencyProperty bir nesnesi üzerinden erişebilirsiniz.

Yöntem 2

X nesnesini INotifyPropertyChanged arabirimde karşı açık duruma getirmiş olursunuz.

Yöntem 3

Veri bağlamada OneTime için ayarlayın.

Durum

Bu davranış tasarım yüzündendir.

Daha fazla bilgi

WPF içinde OneTime özelliği için dinleme gerekir olarak işaretlenmemiş bir veri bağlama işlemi, kaynak nesneyi (X nesnesini) bildirimleri değiştirin. WPF, yerleşik bildirimleri DependencyProperties sınıfının veya bildirimleri INotifyPropertyChanged arabirimden kullanır.

DependencyProperties sınıf ve INotifyPropertyChanged arabirim kullanılamıyorsa, WPF ValueChanged olay kullanır. Bu davranış, P özelliğine denk PropertyDescriptor nesnesinde PropertyDescriptor.AddValueChanged yöntem çağırma içerir. Ne yazık ki, bu eylem, bu PropertyDescriptor nesnenin nesne X güçlü bir başvuru oluşturmak ortak dil çalışma zamanı (CLR) neden olur. CLR, PropertyDescriptor nesnesine başvuru da genel bir tabloda saklar. Bu davranış, aşağıdaki sırayla gerçekleşmesi bir başvuru zinciri neden olur:
  1. Genel bir tablo
  2. PropertyDescriptor nesnesi
  3. Object X
  4. Veri bağlamada hedef

    Not <a1>Nesne</a1> X veri bağlama hedef arasındaki başvuru, "Neden" bölümünde listelenen ilk koşulu nedeniyle oluşur.
  5. Bağlama
Veri bağlama hedef kullanılan sürece, bağlama için değişikliklerini devam etmeniz gerekir. Bu davranış, başvuru PropertyDescriptor nesne arasında Canlı tutar ve X nesnesini ve hedef kullanımda kalır. Bu davranış, X nesnesini ve her nesnenin bir X hangi nesnesine başvuruyor bellek sızıntısına neden oluyor. Bu nesneler, veri bağlama hedef içerir.

WPF, tercih edilen bir bildirim mekanizmalar kullanmak, geçici çözüm yöntem 1 ve yöntem 2'in çözüm neden. Geçici çözüm yöntem 3'ü WPF değişiklik bildirimlerine dinlemek üzere yönlendirir. Tüm üç geçici çözüm yöntemleri arasında PropertyDescriptor nesne başvurusu oluşturmaktan kaçının ve X nesne.

Aşağıdaki kod örneği, sızıntısı koşullarını oluşturulur.
<Label Name="MyLabel">
   <Stack Panel Name="MyStackPanel">
      <TextBlock Text="{Binding ElementName=MyStackPanel, Path=Children.Count}" />
   </StackPanel>
</Label>
Bu kod örneğinde, P özelliği Count özelliğini temsil eder. Ayrıca, <a1>Nesne</a1> XUIElementCollection sınıfı StackPanel.Children özelliği biçiminde temsil edilir.

"Neden" bölümünde ilk koşulu, çünkü için X nesnesinin alt nesnesi X başvuruyor karşılanır. Bağlama hedef TextBlock öğedir ve bu alt bağlama hedef içerir.

Ikinci bir koşul "Neden" bölümünde, <a1>özellik</a1> PDependencyProperty bir nesne değil ve <a1>Nesne</a1> XINotifyPropertyChanged arabirimini uygulamıyor karşılanır. Bu davranış, UIElementCollection sınıfı ve serbest bırakılacak TextBlock öğe neden olur. UIElementCollection sınıfı, bir başvuru StackPanel kapsayıcı sınıfı içerdiğinden ayrıca StackPanel kapsayıcı sınıfı, serbest bırakılmaz. UIElementCollection sınıfı ve TextBlock öğenin ana ağaçtan code:
MyLabel.Content = <Some New Content>;

Özellikler

Makale numarası: 938416 - Last Review: 26 Temmuz 2007 Perşembe - Gözden geçirme: 1.1
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft .NET Framework 3.0
Anahtar Kelimeler: 
kbmt kbtshoot kbprb KB938416 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:938416

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com