我有一个窗口,提醒用户是否有任何消息(代码如下)
每次timer1.Elapsed
,应用程序的内存增加超过1 MB。在10个警报时间之后,它需要超过15 MB。然后,如果有更多的警报,用过的内存几乎不会升起。
我认为15 MB内存对于一个简单的窗口是非常大的,也许我的应用程序是内存泄漏。但我是新手,不知道如何解决它。 你能帮助我,我的代码有任何问题使它内存泄漏吗?非常感谢你!
XAML:
<TextBlock TextWrapping="Wrap"
FontSize="11"
Padding="5,3,3,3">
<Run x:Name="a_time"
Foreground="Blue" />
<Run x:Name="a_now"
FontStyle="Italic" />
<Run x:Name="a_id" />
<LineBreak />
<Run x:Name="a_name"
Foreground="Blue" />
<Run x:Name="a_title"
Foreground="Red"
Tag=""
MouseUp="a_MouseUp"
Cursor="Hand" />
<LineBreak />
<Run x:Name="a_content"
Foreground="Gray" />
</TextBlock>
代码:
List<Alert> alert_list = new List<Alert>();
void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (alert_list.Count == 0) return;
this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
{
this.Background = (this.Background == Brushes.Yellow) ? Brushes.LemonChiffon : Brushes.Yellow;
Point m = Mouse.GetPosition(this);
if ((m.X > 0 & m.X < Width & m.Y > 0 & m.Y < Height) | Keyboard.IsKeyDown(Key.LeftCtrl) | Keyboard.IsKeyDown(Key.RightCtrl)) { showemail_tick = 1; return; }
Alert al = alert_list[alert_list.Count - 1];
a_title.Tag = al.e_link;
a_time.Text = al.e_time + " ";
a_now.Text = DateTime.Now.ToString("dd/MM/yy HH:mm");
a_id.Text = al.e_id;
a_name.Text = al.e_name + " ";
a_title.Text = al.e_title;
a_content.Text = al.e_content;
alert_list.RemoveAt(alert_list.Count - 1);
}));
}
public class Alert
{
public string e_time = "";
public string e_id = "";
public string e_link = "";
public string e_name = "";
public string e_title = "";
public string e_content = "";
public bool e_bip = true;
}
答案 0 :(得分:2)
您没有内存泄漏,因为所有内存分配和释放都是由.NET垃圾收集器管理的。
你在这里看到的正是.NET垃圾收集器对内存做了“无论想做什么”的事实。也就是说,当它不再需要它时,它可以完全自由地保留它以供以后使用它。
所以你不必担心这种内存消耗,这并不意味着你的程序使用了那么多内存:它只是意味着.NET内存管理器决定为自己保留它。
程序员要容易得多:你可以依靠这位经理为你处理所有肮脏的工作。不要担心:如果在某些时候你的内存不足,经理会释放它不需要的东西。但是,如果您的系统很好并且可以将内存分配给您的进程,那么为什么要花时间释放它?当谈到合理数量的记忆时,这就是经理的所作所为。
修改强>
这是你负责记忆的C-like世界和垃圾收集世界之间的巨大飞跃,你依靠一些实体为你处理内存。它有优点(你没有什么可关心的)及其缺点(正如你所提到的,你无法确切地知道何时释放内存,因此不确定你的瞬时内存消耗)。
<强> EDIT2:强>
在评论中提到,不知道这一点。您可以调用System.GC.Collect()
强制垃圾收集器实际释放它不需要的所有内容:doc here,example here。
虽然在你的情况下,你应该让GC做任何你想做的事情,因为它以这种方式进行了优化,并且不会影响你的执行。