C# 当我在项目中使用一段时间时,RAM已满

C# 当我在项目中使用一段时间时,RAM已满,c#,memory,timer,C#,Memory,Timer,我在项目中使用了计时器,但每次运行myTimer.Tick时,myApp都会比以前使用更多内存。 在开始时,在30分钟后使用了63MB的RAM,它使用了700MB private void Window_Loaded_1(object sender, RoutedEventArgs e) { DispatcherTimer tmShowAlarm = new DispatcherTimer(); tmShowAlarm.Tick += new EventHandler(S

我在项目中使用了计时器,但每次运行myTimer.Tick时,myApp都会比以前使用更多内存。 在开始时,在30分钟后使用了63MB的RAM,它使用了700MB

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;
    }

}
private void Window_Loaded_1(对象发送方,路由目标)
{    
Dispatchermer TMSHOWARM=新Dispatchermer();
tmShowAlarm.Tick+=新事件处理程序(ShowAlarm);
TMSHOWARM.Interval=新的时间跨度(1000);
tmShowAlarm.Start();
}
私有void ShowAlarm(对象发送方,事件参数e)
{
字符串strDate=“2019/10/10”;
DatabaseContext oDatabaseContext=null;
尝试
{
oDatabaseContext=新数据库上下文();
var varNote=oDatabaseContext.Notes.Where(_note=>_note.NoteDate.CompareTo(strDate)<0);
dgShowResult.ItemsSource=null;
如果(varNote.Count()>0)
{
dShowResult.ItemsSource=varNote.ToList();
dgShowResult.Visibility=可见性.Visibility;
}
其他的
{
dgShowResult.Visibility=可见性.Hidden;
} 
varNote=null;
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
最后
{
oDatabaseContext.Dispose();
oDatabaseContext=null;
}
}

当我删除dgShowResult.ItemsSource=varNote.ToList()时它不会占用更多内存。

这不会解决您的问题,但您可能更喜欢使用推荐的
标准模式,而不是手动调用
Dispose()

为了增加内存,您必须知道
GC.Collect()
可以在后台随时运行

因此,您所说的问题是正常的:当对象的引用丢失时,托管内存空间不会释放,它们仅标记为在需要时稍后释放,通常是在系统可用内存不足的情况下

因此,您可以在方法末尾明确地调用它:它不保证它运行,但在Windows上,当您调用它时,它通常会运行,同时会造成一点延迟

  finally
  {
    GC.Collect();
  }
因此,
ToList()
分配的不再使用的内存可能会被释放


问题解决了,调度程序将使对象保持活动状态,我应该使用System.Timers.Timer。

只有700MB的内存怎么会“满”??这没什么!垃圾收集器可能正在睡觉,因为实际上没有什么事情要做。你从哪里得到“它使用了700MB”的想法?来自任务管理器。如果你想知道你的应用程序使用了多少内存,你必须运行一个内存分析器。在任务管理器中显示RAM和CPU你检查什么类型的内存以及如何检查?在任务管理器中显示一个应用程序使用了多少RAM和CPU,30分钟后myApp使用了700MB RAM,计算机开始挂断。很抱歉,我英语说得不好。当我删除dgShowResult.ItemsSource=varNote.ToList()时,列名是Memory;它不会使用更多内存。您应该能够选择列来显示更多详细信息。。。因为有很多类型的内存,比如工作集、私有内存、页面内存。。。电流和峰值:和。你应该考虑没有峰值的工作集。如果你不能改进你的任务管理器,你可以在你的应用程序中使用一种方法,比如进程黑客。记住GC不在您的控制范围内。
  finally
  {
    GC.Collect();
  }