سؤال

في حين التحقيق في تسرب الذاكرة اكتشفت أن ذلك كان بسبب الدعوة NewRow() على طاولة داخل حلقة مرات عديدة.ومع ذلك DataRow خلق لم تضاف إلى الجدول الصفوف وجمع صفوف الجدول العد لم يحصل فوق الصفر.

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

يرجى تجاهل مسألة لماذا رمز خلق DataRows التي لا تضاف إلى الجدول!

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

المحلول

وDataRow يرث المخطط من DataTable و، لذلك هناك إشارات من DataRow لمخطط الجدول التي ولدت الصف. الصف الجديد في دولة منفصلة في الجدول.
هذا هو السبب في ترك GC الصفوف غير المستخدمة الجديدة وحدها.

نصائح أخرى

DataTable.NewRow() يضيف إنشاء صف إلى DataTable هو RecordManager.أنا لست متأكدا تماما لماذا يحدث هذا ولكن هذا هو السبب في أنه لم يتم تحرير بواسطة GC.

يبدو أن هناك طريقتان فقط للتخلص من DataRow:

  1. إضافة إلى الطاولة ، ثم حذفه.
  2. دعوة DataTable.واضح().

وأعتقد أن ترتبط اثنين من القضايا الخاصة بك.

وTable.NewRow يخلق صف البيانات الجديد الذي له نفس شكل العمود كما الجدول الأولي.

وهذا الصف جديدا يحتاج إلى أن تضاف إلى الجدول باستخدام table.Rows.Add (newRow). حلقة الخاص بك وسوف يكون خلق الكائنات التي يتم استخدامها أبدا، وبالتالي سوف تلتهم الذاكرة. انظر هذه المقالة للحصول على مزيد من المعلومات http://msdn.microsoft.com/en- لنا / مكتبة / system.data.datatable.newrow.aspx

إذا قمت بإنشاء newRow = table.NewRow () ثم في قانون تقرر أدناه من هذه newRow لك أكثر لا تحتاج إليها. 1) إضافة إذا صف في الجدول. 2) إزالة، فإنه سيتم منع تسرب الذاكرة.

    var table = new DataTable();
    while (true)
    {
        var newRow = table.NewRow();
        table.Rows.Add(newRow);   //Without this 2 rows you will have memory leak.
        table.Rows.Remove(newRow);//
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top