Срещам странна грешка в паметта с приложение на Windows Forms, разработено в Visual Studio 2010. Използвам C# и .NET 4.0, но не мисля, че това е фактор тук. За да възпроизведете, стартирайте ново приложение на Windows Forms и добавете бутон. След това поставете следния код:
public Form1()
{
InitializeComponent();
AllowDrop = true;
DragEnter += new DragEventHandler(Form1_DragEnter);
button1.Click += new EventHandler(button1_Click);
}
private void Form1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Link;
}
private void button1_Click(object sender, EventArgs e)
{
for(int i = 1; i <= 100000; i++)
{
DataGridView dgv = new DataGridView(); // or any other large object
if(i % 100 == 0)
Console.WriteLine("{0}: {1} MB memory in use", i, Environment.WorkingSet / 1024 / 1024);
}
}
Стартирайте програмата, натиснете бутона и гледайте използването на паметта в изходния прозорец. Той се повишава и след това пада обратно, тъй като събирането на боклука се извършва в няколко цикъла. След това го стартирайте отново, плъзнете произволен файл или папка върху формуляра, докато получите иконата за връзка, и след това натиснете бутона отново. Този път използването на паметта трябва да се увеличи монотонно, като събирането на боклук не се извиква или все още има валидни препратки към всички генерирани обекти.
Как може настройването на курсора на ефекта на плъзгане и пускане на връзката да повлияе на използването на паметта като това???