Может кто-нибудь сказать мне, что идет не так?
После удаления тонны кода, чтобы обнаружить утечку нашего объекта GDI (с помощью диспетчера задач и наблюдая, как столбец «Объекты GDI» увеличивается до 10000 и происходит сбой нашего приложения)Я сократил код до только кода .net без какого-либо специального бизнес-кода.Мы все еще получаем проблему.
Я создал тестовое приложение для репликации проблемы, которое имеет следующее основное поведение:
- Откройте форму 150 раз (150 - ничего особенного, просто число, достаточно большое, чтобылегко увидеть "застрявшие" ручки).Таймер в форме закроет форму через 1 секунду
- Запустить сборщик мусора (не очень необходимо, но может помочь избавиться от «хороших» или «работающих» объектов, которые не являются частью проблемы)
- Соблюдайте вручную количество объектов GDI приложения (вы должны сделать это до и после того, как вы откроете форму 150 раз.) Перед тем, как запустить тест, я обычно получаю счет 36, после того, как тест составляет около190. Каждый раз, когда я запускаю тест, это число увеличивается примерно на 150.
Теперь форма, которая запускается 150 раз, настраивается особым образом (давайте вызовем форму «BadForm».Статический объект данных связан с комбинированным списком в форме.
На BadForm есть поле со списком и таймер. Вот код для формы:
using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
namespace GDIObjectLeakTest
{
public partial class MyForm :Form
{
public static DataTable CachedNodeType = new DataTable();
public MyForm()
{
InitializeComponent();
this.comboBox1.SelectedIndexChanged += new EventHandler(this.comboBox1_SelectedIndexChanged);
this.Font = new Font("Modern No. 20", 8.249999F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(0))); ;
comboBox1.DataSource = CachedNodeType;
}
private void timer1_Tick(object sender, EventArgs e)
{
Close();
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{ }
}
}
Воткод для основной формы приложения, которое запускает тест. На нем 2 кнопки. Button1 запускает BadForm 150 раз. Кнопка 2 запускает сборщик мусора 100 раз (я полагаю, один или два раза мне не достаточно) (я используюсборщик мусора, чтобы доказать, что есть / не проблема).
private void button1_Click(object sender, EventArgs e)
{
try
{
for(int i = 0; i < 150; i++)
{
//new SearchForm().Show();
new MyForm().Show();
}
} catch(Exception ee)
{
throw;
}
}
private void button2_Click(object sender, EventArgs e)
{
for(int i = 0; i < 100; i++)
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}