Утечка памяти в приложении .net - PullRequest
0 голосов
/ 19 октября 2011

Я работаю над настольным приложением в VB.net 2005. Приложение содержит таймер с интервалом 1 мин.Каждый раз, когда срабатывает таймер, выполняется набор функций, в основном связанных с базой данных.Изначально приложение работает нормально.В процессах (диспетчер задач) загрузка процессора увеличивается до 100% при каждом вызове таймера.Но время составляет около 1 секунды (незначительно).Однако с течением времени и примерно через 20 часов промежуток времени timer_tick увеличивается примерно до 20-30 секунд.В этот период загрузка процессора составляет 100%, и приложение не отвечает.Постепенно промежуток времени timer_tick увеличивается до 1 минуты, а процессор использует 100%, а приложение не отвечает.Все объекты правильно расположены.Более того, эта проблема связана с процессорами Pentium 4.Приложение работает на Core 2 Duo.

Таймер содержит 4 функции ... Я добавляю несколько из этих функций ..

 Public Sub SetNotes()
    Dim dtOld As DataTable
    Dim dtNew As DataTable
    Dim oApptTasks As New AppointmentsAndTasks

    dtOld = oApptTasks.PopulateAllTasks  ' get the source table
    dtNew = dtOld.Clone  '  make new table ad clone of old table

    If btnShowNotes.Text = "Hide Notes" Then
        For Each item As System.Data.DataRow In dtOld.Rows
            If Not IsDBNull(item("Notes")) Then
                If item("Notes") <> "" Then ' add only if not null and not blank
                    item("Task") = item("Task") & vbCrLf & item("Notes") ' concatenate the notes field
                End If
            End If
            dtNew.ImportRow(item) ' import modified row to new table
        Next

        grdcTask.DataSource = SetAssignedTo(dtNew) ' set the datasource
        grdcTask.DataSource = SetAssignedFrom(grdcTask.DataSource) ' set the datasource
        repMemoNotes.LinesCount = 0 ' adjust the height of custom field
    Else
        grdcTask.DataSource = SetAssignedTo(dtOld) ' set the datasource
        grdcTask.DataSource = SetAssignedFrom(grdcTask.DataSource) ' set the datasource
    End If
End Sub

Теперь это одна из четырех функций называетсяby timer ... который использует следующий код для извлечения данных из базы данных.

  Using conn As New SqlConnection(glbSqlConnString)
        Try
            conn.Open()
            Dim dbDataAdapter As New SqlDataAdapter(oStrQueryBuilder.ToString, conn)
            dbDataAdapter.Fill(dbDataTable)

        Catch ex As Exception
            EventLog.WriteLog("App", ex.ToString, EventLogEntryType.Error)
        Finally
            If conn.State = ConnectionState.Open Then
                conn.Close()
            End If
        End Try
    End Using

Многие запросы на выбор, обновление и удаление выполняются в таймере.

Эта проблема возникает, когда яиспользуя около 7000 записей в базе данных.С меньшим количеством записей проблема не возникает.Итак, могут ли запросы SQL быть виновником этого.

Не могли бы вы подсказать, что может быть причиной утечки памяти?

Ждем помощи.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 21 октября 2011

Я делаю предположение здесь, поскольку вы упомянули, что проблема возникает только тогда, когда количество записей превышает 7000; это может быть ситуация, когда следующий триггер срабатывает до того, как предыдущее событие завершило свою работу с базой данных. Это может вызвать отставание в операции, которая должна быть выполнена, и она просто продолжает получать больше, когда время идет.

Я бы порекомендовал вам убедиться, что в каждый момент времени выполняется только 1 набор операций. Например, используйте приведенную ниже логику для запуска функции таймера

Function TimerFunction
     'Diable Timer - This will disable the timer so that no more timer events are triggered'
     timer1.Enabled = False


     Function1()
     Function2()
     Function3()
     Function4()

     'Enable Timer - Now enable the timer again so that it can continue normally'
     timer1.Enabled=True

End

Но вам обязательно нужно профилировать работу базы данных и настроить операцию, которая задерживает выполнение программы. Вызывает беспокойство тот факт, что производительность ваших приложений начинает отставать от 7000 записей.

Надеюсь, это поможет.

0 голосов
/ 21 октября 2011

Я бы порекомендовал использовать некоторые инструменты Profiler. Есть некоторые бесплатные, но по моему опыту коммерческие инструменты стоят своей цены.

Например, ANTS Profiler. http://www.red -gate.com / продукция / DotNet-разработка / Возможно, вам достаточно оценочных периодов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...