0

如果有任何消息(代码如下),我有一个窗口会提醒用户。
每次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;
}
4

1 回答 1

2

您没有内存泄漏,因为所有内存分配和释放都由 .NET 垃圾收集器管理。

您在此处看到的正是 .NET 垃圾收集器对内存“做任何事情”这一事实。也就是说,当它不再需要它时,它完全可以自由地保留它以供以后使用。

所以你不必担心这种内存消耗,这并不意味着你的程序使用了那么多内存:它只是意味着 .NET 内存管理器决定为自己保留它。

这对程序员来说要容易得多:你可以依靠这个管理器来为你处理所有的脏活。不用担心:如果在某些时候你的内存不足,管理器会释放它不需要的任何东西。但是,如果您的系统很好并且可以忍受仍然分配给您的进程的内存,那么为什么要花时间释放它呢?这就是经理所做的,当然,当谈到合理的内存量时。

编辑:

这是您负责记忆的类 C 世界与依赖某个实体为您处理记忆的垃圾收集世界之间的巨大飞跃。它具有优点(您无需关心任何事情)和缺点(正如您所提到的,您无法准确判断何时释放内存,因此不确定您的瞬时内存消耗)。

编辑2:

评论里有提到,不知道。您可以调用System.GC.Collect()强制垃圾收集器实际释放它不需要的所有内容:此处的文档,此处示例

虽然在你的情况下,你应该让 GC 做任何它想做的事情,因为它是这样优化的,它不会影响你的执行。

于 2013-04-12T05:06:00.537 回答