Я столкнулся с странной ошибкой памяти в приложении 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);
}
}
Запустите программу, нажмите кнопку и посмотрите, как используется память в окне вывода. Он резко увеличивается, а затем падает, поскольку сборка мусора происходит в несколько циклов. Затем запустите его еще раз, перетащите любой случайный файл или папку в форму, пока не получите значок ссылки, а затем снова нажмите кнопку. На этот раз использование памяти должно монотонно увеличиваться, например, сборщик мусора не вызывается или все еще существуют действительные ссылки на все сгенерированные объекты.
Как установка курсора на эффект перетаскивания ссылки может повлиять на использование памяти таким образом ???