Утечка памяти VB6 из объекта взаимодействия

#vb6 #activex #com-interop

#vb6 #activex #com-взаимодействие

Вопрос:

У меня есть элемент управления взаимодействием ActiveX, который используется в старом приложении VB6. Элемент управления ActiveX является компонентом gridview и загружает несколько сотен тысяч записей, потребляя около 300 МБ памяти при каждом запуске.

В конечном итоге у VB заканчивается память.

Элемент управления взаимодействием ссылается как обычный элемент управления activex и загружается с помощью следующего кода

 dim withevents gridview as vbcontrolextender
dim withevents uv as applicationlistcontrol.appgrid
dim imc as applicationlistcontrol.iappgrid

private sub form_load

set gridview = Controls.Add("Applicationlistcontrol.appgrid", "ApplicationListView", me)
set uv = gridview.Control
set imc = uv
imc.FillGrid '(Calls the C# control and loads data into grid)
end sub

private sub form_unload
set imc = nothing
set uv = nothing 
set gridview = nothing 
end sub
  

Память также сохраняется при выходе из приложения и возвращении в VB6 IDE, и при следующем запуске еще 300 МБ будут разжеваны.

Это функция, которая загружает данные:

 using (SqlConnection connection = new SqlConnection(_connectionString)) 
{ 
    connection.Open(); 
    using (var command = new SqlCommand("SELECT * FROM APPLICATION_LIST WHERE APPLICATION_TYPE_ID = 1", connection)) 
    { 
        using (var table = new DataTable()) 
        { 
            table.Load(command.ExecuteReader()); 
        } 
    } 
} 

GC.Collect(); 
GC.WaitForFullGCComplete(); 
return null;
  

Комментарии:

1. Есть ли у элемента управления какой-то .Dispose() метод?

2. Сейчас только в тестовом режиме. Но я могу добавить все, что захочу.

3. Если вы написали этот компонент и имеете контроль над исходным кодом, вам следует добавить исходный код сюда. Постарайтесь создать как можно меньше полного примера кода, который воспроизводит проблему.

4. @siwix К вашему сведению, я добавил код из вашего комментария к Q, чтобы я мог его прочитать; но в будущем вы можете сами отредактировать Q, чтобы сделать это.

5. Для целей тестирования вызовы GC могут быть полезны, если они находятся в нужном месте. Но я не думаю, что это правильное место 🙂 Вы хотели бы вызвать их, как только память, выделенная для элемента управления, больше не нужна, но, похоже, она все еще нужна в опубликованном вами коде. Вызовите это в основном в конце form_unload . Для этого может потребоваться добавить временный метод. Кроме того, вам может потребоваться второй GC.Collect() вызов, следующий WaitForFullGCComplete