Увеличение использования памяти при прокрутке элементов списка в vb.net - PullRequest
0 голосов
/ 21 февраля 2019

В WinForm у меня есть два списка (lvwTemplateCategory), один из которых перечисляет папки в данном каталоге, и если вы выбираете папку, другой список (lvwTemplates) показывает файлы в этом каталоге.У меня также есть одна картинка (picTemplateImage), чтобы показать скриншот предварительного просмотра этого файла.

В то время как я прокручиваю в этой форме 2-3 папки и 9-10 файлов, объем используемой памяти увеличивается с 62 МБ до 120 МБ..

Я не знаю, как управлять источником памяти, также я пытался реализовать IDisposable, но не знаю, где реализовать.

PS Я использую VS 2017 и вызываю этот WinForm с помощью.Метод Show ().

Также, если вы видите нелогические коды, пожалуйста, дайте мне знать.

Option Explicit On
Option Strict On
Imports System.IO
Public Class frmCreateNewModel
    Implements IDisposable

    Private Sub LoadForm(sender As Object, e As EventArgs) Handles MyBase.Load
        Call AddRootDatabase()
        splCreateNewModel.Panel2Collapsed = True
        Size = New Size(946, 800)
    End Sub
    Private Sub ViewLargeIcons(sender As Object, e As EventArgs) Handles cmdViewLargeIcons.Click
        lvwTemplateCategory.View = View.LargeIcon
    End Sub

    Private Sub ViewListIcons(sender As Object, e As EventArgs) Handles cmdViewList.Click
        lvwTemplateCategory.View = View.List
    End Sub
    Private Sub AddRootDatabase()
        Try
            Dim DirDB As String = My.Settings.str_db__path_tpl

            Dim DirInfoDB As New DirectoryInfo(DirDB)
            For Each TplDirDB As DirectoryInfo In DirInfoDB.GetDirectories
                If Not (TplDirDB.Attributes And FileAttributes.Hidden) = FileAttributes.Hidden Then
                    cboTemplateDatabase.Items.Add(TplDirDB.Name)
                End If
            Next
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
    Private Sub SelectRootDatabase(sender As Object, e As EventArgs) Handles cboTemplateDatabase.SelectedIndexChanged
        Try
            lvwTemplateCategory.Items.Clear()
            lvwTemplates.Items.Clear()
            Dim DirTempRootDir As String = My.Settings.str_db__path_tpl & "\" & cboTemplateDatabase.SelectedItem.ToString
            Dim DirTempDbInfo As New DirectoryInfo(DirTempRootDir)
            Dim lstIcon As Integer
            For Each TplCatDir As DirectoryInfo In DirTempDbInfo.GetDirectories
                If Not (TplCatDir.Attributes And FileAttributes.Hidden) = FileAttributes.Hidden Then
                    If imgIcons.Images.ContainsKey(TplCatDir.Name) = True Then
                        lstIcon = imgIcons.Images.IndexOfKey(TplCatDir.Name)
                    Else
                        lstIcon = imgIcons.Images.IndexOfKey("default")
                    End If
                    lvwTemplateCategory.Items.Add(TplCatDir.Name, lstIcon)
                End If
            Next
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
    Private Sub SelectTemplateCategory(sender As Object, e As EventArgs) Handles lvwTemplateCategory.SelectedIndexChanged
        If (CInt(lvwTemplateCategory.SelectedItems.Count.ToString) = 0) Then
            Return
        End If

        Dim DirTempCatDir As String = My.Settings.str_db__path_tpl & "\" & cboTemplateDatabase.SelectedItem.ToString & "\" & lvwTemplateCategory.SelectedItems(0).Text.ToString
        Dim DirTempInfo As New DirectoryInfo(DirTempCatDir)
        lvwTemplates.Items.Clear()
        Try
            For Each TplFile As FileInfo In DirTempInfo.GetFiles
                If Not (TplFile.Attributes And FileAttributes.Hidden) = FileAttributes.Hidden Then
                    If Path.GetExtension(TplFile.Name) = ".spck" Or Path.GetExtension(TplFile.Name) = ".buspck" Then
                        lvwTemplates.Items.Add(TplFile.Name)
                    End If
                End If
            Next
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
    Private Sub SelectTemplate(sender As Object, e As EventArgs) Handles lvwTemplates.SelectedIndexChanged
        If (CInt(lvwTemplates.SelectedItems.Count.ToString) = 0) Then
            cmdQuickConfigure.Enabled = False
            Return
        End If
        cmdQuickConfigure.Enabled = True

        Dim TemplFileName As String = Path.GetFileNameWithoutExtension(lvwTemplates.SelectedItems(0).Text.ToString)
        Dim DirTempDir As String = My.Settings.str_db__path_tpl & "\" & cboTemplateDatabase.SelectedItem.ToString & "\" & lvwTemplateCategory.SelectedItems(0).Text.ToString & "\" & TemplFileName
        Dim imagePath As String = DirTempDir & ".png"
        If File.Exists(imagePath) Then
            picTemplateImage.ImageLocation = (imagePath)
            picTemplateImage.SizeMode = PictureBoxSizeMode.StretchImage
            picTemplateImage.Load()
        Else
            picTemplateImage.Image = picTemplateImage.ErrorImage
        End If
        txtModelName.Text = lvwTemplates.SelectedItems(0).Text.ToString
    End Sub
    Private Sub VisualViewControl(sender As Object, e As EventArgs) Handles cmdVisualControl.Click
        If splCreateNewModel.Panel2Collapsed = False Then
            splCreateNewModel.Panel2Collapsed = True
            Size = New Size(946, 800)
            cmdVisualControl.Text = ">>"
        Else
            cmdVisualControl.Text = "<<"
            splCreateNewModel.Panel2Collapsed = False
            Size = New Size(1300, 800)

        End If
    End Sub
    Private Sub BrowseDirectory(sender As Object, e As EventArgs) Handles cmdBrowseDirectory.Click
        Try
            Dim sfd As New SelectFolderDialog With {
                .Title = "Select a folder"
            }
            If sfd.ShowDialog(Me) = DialogResult.OK Then
                txtModelDirectory.Text = sfd.FolderName
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
        Private Sub DialogOK(sender As Object, e As EventArgs) Handles cmdOk.Click
        CreateModel()
        Close()
    End Sub
    Private Sub DialogCancel(sender As Object, e As EventArgs) Handles cmdCancel.Click
        Close()
    End Sub
End Class
...