أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

احتمال حدوث تسرب للذاكرة عند استخدام ربط البيانات في البنية الأساسية لعرض برامج Windows

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية938416
الأعراض
عند استخدام ربط البيانات في Microsoft Windows العروض Foundation (WPF) ، قد تحدث مشكلة حدوث تسرب للذاكرة.
السبب
تحدث هذه المشكلة إذا تحققت الحالتين التاليتين:
  • يشير مسار ربط البيانات إلى الخاصية P كائن X.
  • يتضمن كائن X مرجع مباشر أو مرجع غير مباشر إلى هدف عملية ربط البيانات.
  • يتم الوصول إلى الخاصية P من خلال كائن PropertyDescriptor بدلاً من كائن DependencyProperty أو كائن PropertyInfo.
الحل البديل
كمحاولة للتغلب على هذه المشكلة استخدم إحدى الطرق التالية.

الطريقة الأولى

الوصول إلى الخاصية P من خلال كائن DependencyProperty.

الطريقة الثانية

يقوم بالكشف عن واجهة INotifyPropertyChanged على كائن X.

الطريقة الثالثة

تعيين وضع ربط البيانات OneTime.
تصريح
يعتبر هذا السلوك حسب التصميم.
معلومات أخرى
في WPF, تغيير عملية ربط البيانات التي لم يتم وضع علامة كما يجب أن الاستماع OneTime الخاصية إعلامات من الكائن المصدر (كائن X). يستخدم WPF إعلامات المضمنة فئة DependencyProperties أو الإعلامات من واجهة INotifyPropertyChanged.

في حالة عدم توفر فئة DependencyProperties و واجهة INotifyPropertyChanged ، يستخدم WPF الحدث ValueChanged. يتضمن هذا السلوك استدعاء الأسلوب PropertyDescriptor.AddValueChanged على كائن PropertyDescriptor المتوافق مع الخاصية P. لسوء الحظ، يؤدي هذا الإجراء وقت تشغيل اللغة العامة (CLR) لإنشاء مرجع قوية من هذا الكائن إلى كائن PropertyDescriptorX. يحتفظ CLR أيضاً مرجع إلى كائن PropertyDescriptor في جدول عمومية. يؤدي هذا السلوك سلسلة مرجع في الترتيب التالي:
  1. جدول العمومية
  2. كائن PropertyDescriptor
  3. Object X
  4. الهدف ربط البيانات

    ملاحظة مرجع بين كائن X والهدف ربط البيانات ينتج عن الشرط الأول المسردة في قسم "السبب".
  5. الربط
طالما أن يتم استخدام الهدف ربط البيانات يجب أن تستمر الربط استمع التغييرات. يحتفظ المرجع الحياة بين الكائن PropertyDescriptor هذا السلوك كما كائن X ويظل الهدف قيد الاستخدام. يؤدي هذا السلوك تسرب للذاكرة في كائن X وفي كل كائن يشير إلى أي كائن X. تتضمن هذه الكائنات الهدف ربط البيانات.

الحل البديل الطريقة الأولى "و" الحل البديل الطريقة الثانية يؤدي WPF لاستخدام أحد آليات الإعلام المفضل. الحل البديل الطريقة الثالثة إرشاد WPF لا للاستماع إعلامات التغيير. الحل البديل ثلاثة أساليب تجنب إنشاء مرجع بين كائن PropertyDescriptor ثم كائن X.

يتم إنشاء شروط تسرب في مثال التعليمة البرمجية التالي.
<Label Name="MyLabel">   <Stack Panel Name="MyStackPanel">      <TextBlock Text="{Binding ElementName=MyStackPanel, Path=Children.Count}" />   </StackPanel></Label>
في هذا المثال رمز يمثل الخاصية Count الخاصية P. بالإضافة إلى ذلك، يتم تمثيل كائن XUIElementCollection فئة في نموذج الخاصية StackPanel.Children.

تم تحقيق الشرط الأول في قسم "السبب" لأن الكائن X يشير إلى توابع الكائن X. تتضمن هذه التوابع الهدف الربط ويكون الهدف ربط عنصر TextBlock.

تم تحقيق الشرط الثاني في قسم "السبب" لأن الخاصية P غير كائن DependencyProperty لا يقوم كائن X بتطبيق واجهة INotifyPropertyChanged. يؤدي هذا السلوك في الفئة UIElementCollection وعنصر TextBlock وليس إلى تحرير. بالإضافة إلى ذلك، فئة حاوية StackPanel لا يتم تحرير ، وحيث فئة UIElementCollection تحتوي على مرجع إلى فئة حاوية StackPanel. يحدث هذا السلوك حتى إذا فئة UIElementCollection وعنصر TextBlock تتم إزالة من شجرة الرئيسي باستخدام السطر التالي من code:
MyLabel.Content = <Some New Content>;

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 938416 - آخر مراجعة: 07/26/2007 16:07:51 - المراجعة: 1.1

Microsoft .NET Framework 3.0

  • kbmt kbtshoot kbprb KB938416 KbMtar
تعليقات
/html>ype="text/JavaScript" async=""> var varAutoFirePV = 1; var varClickTracking = 1; var varCustomerTracking = 1; var Route = "76500"; var Ctrl = ""; document.write(" >/html>'language-'+language.locale}}" href="" ng-click="setLanguage(language);" class="ng-binding" id="language-es-ve">Venezuela - Español
/c1.microsoft.com/c.gif?DI=4050&did=1&t=">id=1&t=">