Когда я использую Time в моем проекте, RAM заполняется - PullRequest
0 голосов
/ 31 октября 2019

Я использую таймер в своем проекте, но каждый раз, когда запускается myTimer.Tick, myApp использует больше памяти, чем раньше. При запуске в используемой оперативной памяти 63 МБ, через 30 минут она использовала 700 МБ.

private void Window_Loaded_1(object sender, RoutedEventArgs e)
{    
    DispatcherTimer tmShowAlarm = new DispatcherTimer();
    tmShowAlarm.Tick += new EventHandler(ShowAlarm);
    tmShowAlarm.Interval = new TimeSpan(1000);
    tmShowAlarm.Start();
}

private void ShowAlarm(object Sender, EventArgs e)
{
     string strDate = "2019/10/10";
     DatabaseContext oDatabaseContext = null;
     try
     {
         oDatabaseContext = new DatabaseContext();
         var varNote = oDatabaseContext.Notes.Where(_note => _note.NoteDate.CompareTo(strDate ) < 0);

         dgShowResult.ItemsSource = null;
         if (varNote.Count() > 0)
         {
             dgShowResult.ItemsSource = varNote.ToList();
             dgShowResult.Visibility = Visibility.Visible;
         }
         else
         {
             dgShowResult.Visibility = Visibility.Hidden;
         } 

         varNote = null;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        oDatabaseContext.Dispose();
        oDatabaseContext = null;
    }

}

Когда я удаляю dgShowResult.ItemsSource = varNote.ToList (); она не использует больше памяти.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Решено, DispatcherTimer будет поддерживать объект в живых, я должен использовать System.Timers.Timer.

0 голосов
/ 31 октября 2019

Это не решит вашу проблему, но вы можете предпочесть использовать рекомендованный стандартный шаблон using вместо ручного вызова Dispose():

using (var oDatabaseContext = new DatabaseContext() )
  try
  {
    //
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message);
  }

Для увеличения памяти вы должны знать, что GC.Collect() может работать в любое время в фоновом режиме.

Следовательно, то, что вы называете проблемой, является нормальным: пробелы управляемой памяти не освобождаются, когда вы потеряли, сохраняются ссылки на объекты, они отмечаются только как освобождаемые позже, когда это необходимо. обычно, если в системе недостаточно памяти.

Таким образом, вы можете вызывать ее явно в конце метода: он не гарантирует, что он работает, но в Windows он обычно запускается, когда вы вызываете его, вызываянебольшое отставание.

  finally
  {
    GC.Collect();
  }

Поэтому возможно память, выделенная ToList(), которая больше не используется, будет освобождена.

https://docs.microsoft.com/dotnet/api/system.gc.collect#System_GC_Collect

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