背景工人不清理资源

时间:2017-04-12 00:19:13

标签: vb.net memory-leaks resources backgroundworker

我目前正在开发一个应用程序,它使用BW从数据库中获取一些信息。它使用商店号码(称为IDP)并搜索正确的数据库。它完全符合我的需求。但是,每次运行时,它都会在10-300 KB之间添加到RAM中,一旦完成,它就不会释放这个内存。由于这些代码每天可以由资源有限的虚拟机上的许多不同的人运行数百次,因此我真的需要它来释放它使用的任何内存。谁能看到我哪里出错了?

注意:我是自学成才的,我这样做更像是一种帮助我在工作中而不是实际工作的爱好,因为我相信你们中的一些人会很高兴知道一次看到我的新手代码。

 Public Sub KickoffStoreBrief() 'Called when txtIDP (text box) text changes
        Dim args As BW_GetStoreBriefVariables = New BW_GetStoreBriefVariables()


        args.Current_IDP = txtIDP.Text.Trim

        If BW_GetStoreBrief.IsBusy Then
            MsgBox("Worker busy!")
        Else
            BW_GetStoreBrief.RunWorkerAsync(args)
        End If

 End Sub

Private Sub BW_GetStoreBrief_DoWork(sender As Object, e As DoWorkEventArgs) Handles BW_GetStoreBrief.DoWork

        Dim args As BW_GetStoreBriefVariables = DirectCast(e.Argument, BW_GetStoreBriefVariables) 'Convert the generic Object back into a MyParameters object

        Using DatabaseConnection As New SqlConnection(args.ConnectionString)
            Dim command As New SqlCommand(SQL CODE IS HERE, DatabaseConnection)
            command.CommandTimeout = 20

            'Attempt to open the connection
            command.Connection.Open()

            Dim reader As SqlDataReader = command.ExecuteReader()
            Dim dt As New DataTable()
            dt.Load(reader)
            reader = Nothing

            'Check if returned anything
            If dt.Rows.Item(0).Item(0) = Nothing Or dt.Rows.Item(0).Item(0).ToString = "False" Or dt.Rows.Item(0).Item(0).ToString = "" Then
                'Branch not found.
                GoTo Ender
            End If

            'Prefix 0's infront of the IDP as required
            Dim CompleteIDPNumber As String = ""
            If dt.Rows.Item(0).Item(0).ToString.Length < 4 Then
                If dt.Rows.Item(0).Item(0).ToString.Length = 2 Then
                    CompleteIDPNumber = "00" & dt.Rows.Item(0).Item(0).ToString
                ElseIf dt.Rows.Item(0).Item(0).ToString.Length = 3 Then
                    CompleteIDPNumber = "0" & dt.Rows.Item(0).Item(0).ToString
                Else
                    CompleteIDPNumber = dt.Rows.Item(0).Item(0).ToString
                End If
            Else
                CompleteIDPNumber = dt.Rows.Item(0).Item(0).ToString
            End If

            'Populate strings

            Dim StoreName As String = CompleteIDPNumber & " - " & dt.Rows.Item(0).Item(1).ToString.Trim
            Dim UISupports As Integer = 20 'This is the amount of characters that will fit in label space


            If StoreName.Length > UISupports Then
                StoreName = StoreName.Substring(0, UISupports).ToString.Trim & "..." & " (" & dt.Rows.Item(0).Item(3).ToString.Trim & ")"
            Else
                StoreName = StoreName & " (" & dt.Rows.Item(0).Item(3).ToString.Trim & ")"
            End If

            args.Brief_StoreName = StoreName

            StoreName = Nothing 'We no longer need this, release it from memory
            UISupports = Nothing 'We no longer need this, release it from memory
            CompleteIDPNumber = Nothing 'We no longer need this, release it from memory

            If dt.Rows.Item(0).Item(2) = 0 Or dt.Rows.Item(0).Item(2).ToString.Trim = "0" Then
                args.Brief_POSNumber = "IS"
            Else
                args.Brief_POSNumber = dt.Rows.Item(0).Item(2).ToString.Trim
            End If

            args.Brief_Category = dt.Rows.Item(0).Item(3).ToString 'CAT
            args.Brief_STCamera = dt.Rows.Item(0).Item(4).ToString 'Counter
            args.Brief_Franch = dt.Rows.Item(0).Item(5).ToString 

Ender:
            e.Result = args
            'Close connection
            dt.Dispose()
            command.Connection.Close()
            command.Dispose()
        End Using
    End Sub

    Private Sub BW_GetStoreBrief_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BW_GetStoreBrief.RunWorkerCompleted

        If e.Error IsNot Nothing Then
            ListBox1.Items.Insert(0, Now.ToString("HH:mm:ss") & " | Error | Unable to connect to store DB.")
            lblNotFound.Text = "Unable to connect to database."
            Panel_NotFound.Visible = True
            Panel_NotFound.BringToFront()
            ErrorLogger.LogError(System.Reflection.MethodBase.GetCurrentMethod().Name, e.Error.Message, 0)
        ElseIf e.Cancelled Then
        Else
            ' Access variables through args
            Dim args As BW_GetStoreBriefVariables = DirectCast(e.Result, BW_GetStoreBriefVariables) 'Convert the generic Object back into a MyParameters object

            If args.Brief_StoreName = "" Then
                ListBox1.Items.Insert(0, Now.ToString("hh:mm:ss") & " | Notice | IDP " & args.Current_IDP & " not found in database.")

                'show warning panel
                lblNotFound.Text = "Store not found in database."
                Panel_NotFound.Visible = True
                Panel_NotFound.BringToFront()
                GoTo Ender
            Else
                'Store found update UI

                lblBranchInfo_StoreName.Text = args.Brief_StoreName
                lblBranchInfo_POSNumber.Text = args.Brief_POSNumber
                lblBranchInfo_CameraType.Text = args.Brief_STCamera

                Panel_NotFound.Visible = False
                Panel_NotFound.SendToBack()
            End If

            args = Nothing

        End If

Ender:
        btnStoreDetails.Enabled = True
    End Sub

正如你所看到的,我已经试图确保我不会留下任何东西,但是记忆力不断上升并且不会下降。总的来说,当这些代码只运行几次时,我们正在谈论使用35MB,并且程序/表单没有其他任何事情发生。因为这是在远程虚拟机上,程序可以打开几天而不会被关闭,并且每次内存使用量增加都会成为一个非常大的问题。任何帮助将不胜感激。

0 个答案:

没有答案
相关问题