سؤال

يمكن للشخص شرح الفوائد الرئيسية من أنواع مختلفة من الإشارات في C# ؟

  • إشارات ضعيفة
  • لينة المراجع
  • فانتوم المراجع
  • إشارات قوية.

لدينا أحد التطبيقات التي تستهلك الكثير من الذاكرة ونحن نحاول تحديد ما إذا كان هذا هو مجال التركيز على.

هل كانت مفيدة؟

المحلول

أعتقد أن المراجع الناعمة والوهمية تأتي من Java.يمكن اعتبار المرجع الضعيف الطويل (الذي يتم تمريره بشكل صحيح إلى مُنشئ WeakReference الخاص بـ C#) مشابهًا لمرجع PhantomReference الخاص بـ Java.إذا كان هناك نظير لـ SoftReference في C#، فلا أعرف ما هو.

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

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

نصائح أخرى

MSDN لديه شرح جيد إشارات ضعيفة.الرئيسية الاقتباس في أسفل حيث يقول:

تجنب استخدام إشارات ضعيفة كما الحل التلقائي في الذاكرة إدارة المشاكل.بدلا من تطوير فعالة سياسة التخزين المؤقت ل التعامل مع التطبيق الخاص بك الكائنات.

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

تم شرح مثال حقيقي رائع مع WeakReference في دروس تطوير أندرويد.

توجد صورة (صورة نقطية) وحاوية صورة في طريقة العرض (ImageView).إذا كان سيتم تحميل الصورة ليس من الذاكرة (ولكن على سبيل المثال.من القرص، الشبكة) ثم يمكنه قفل مؤشر ترابط واجهة المستخدم والشاشة.لتجنب ذلك يمكن استخدام مهمة غير متزامنة.

تنشأ المشكلة عند انتهاء المهمة غير المتزامنة.قد لا تكون حاوية الصور مفيدة على الإطلاق في ذلك الوقت (يتم تغيير الشاشة أو يقوم Android بإلغاء تحميل جزء العرض غير المرئي بعد التمرير).يمكن أن يساعد WeakReference هنا وسيتم جمع البيانات المهملة في ImageView.

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
    private final WeakReference<ImageView> imageViewReference;

    public BitmapWorkerTask(ImageView imageView) {
        imageViewReference = new WeakReference<ImageView>(imageView);
    }
    // Method for getting bitmap is removed for code clearness

    // Once complete, see if ImageView is still around and set bitmap.
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (imageViewReference != null && bitmap != null) {
            final ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}

ملاحظة.المثال موجود بلغة Java، ولكن يمكن لمطوري C# فهمه.
مصدر: http://developersdev.blogspot.ru/2014/01/weakreference-example.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top