.Net и Bitmap не удаляются автоматически сборщиком мусора, когда не остается памяти

Мне интересно, как в .NET работает выделение и удаление памяти, выделенной для растровых изображений.

Когда я создаю множество растровых изображений в циклах в функции и вызываю их последовательно, это будет работать до тех пор, пока в какой-то момент Bitmap не сможет выделить память, выдав исключение «Недопустимый параметр» для указанного размера.

Если я вызываю сборщик мусора с какого-то времени до того, как он работает.

С помощью следующего кода вы сможете воспроизвести ошибку:

class BitmapObject {
    public bool Visible {
        get { return enb; }
        set { enb = value; }
    }
    private bool enb;
    private Bitmap bmp;
public BitmapObject(int i, bool en)
{
    enb = en;
    bmp = new Bitmap(i, i);


   }
}

class Pool<T> where T : BitmapObject
{
    List<T> preallocatedBitmaps = new List<T>();
public void Fill() {
    Random r = new Random();
    for (int i = 0; i < 500; i++) {
        BitmapObject item = new BitmapObject(500, r.NextDouble() > 0.5);
        preallocatedBitmaps.Add(item as T);
    }
}

public IEnumerable<T> Objects
{
    get
    {
        foreach (T component in this.preallocatedBitmaps)
        {
            if (component.Visible)
            {
                yield return (T)component;
            }
        }


     }
    }
}

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
{
    for (int i = 0; i < 10; i++ )
    {
        Test();

            // without this it breaks
            //GC.Collect();
            //GC.WaitForPendingFinalizers();
        }

        Console.ReadKey();
    }

    private static void Test() {
        Pool<BitmapObject> pool = new Pool<BitmapObject>();
        pool.Fill();

        for (int i = 0; i < 100; i++)
        {
            var visBitmaps = pool.Objects;
            // do something
        }       
     }
}
11
задан Marino Šimić 30 April 2011 в 00:23
поделиться