为什么带有DispatcherTimer的简单wpf C#应用程序似乎泄漏了内存?

时间:2011-11-30 08:42:17

标签: c# wpf

我创建了一个带有单个文本框的简单wpf C#和DispatcherTimer,它每秒显示对GC.GetTotalMemory(true)的调用结果。每次调用返回的值都会稳定增加,任务管理器会显示私有工作内存集也会增加。 这真的是内存泄漏,还是只是一个外观?在我真实的应用程序中,每个滴答内容都会发生很多事情,内存泄漏显得更高。 我的代码如下

XAML

<Window x:Class="TestWPFApplication.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <TextBox Name="memoryuseage"></TextBox>
    </Grid>
</Window>

xaml.cs

namespace TestWPFApplication
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        System.Windows.Threading.DispatcherTimer tmr;

        public Window1()
        {
            InitializeComponent();

            tmr = new System.Windows.Threading.DispatcherTimer();
            tmr.Interval = new System.TimeSpan(0, 0, 1);
            tmr.Tick += new EventHandler(StaticTick);
            tmr.Start();
        }

        void StaticTick(object o, EventArgs sender)
        {
            memoryuseage.Text = GC.GetTotalMemory(true).ToString();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

  

这真的是内存泄漏,还是只是一个外观?

只是外观。稳定的增加是正常的,它不是泄漏,直到你可以通过运行它足够长时间崩溃它。但这可能需要几天时间才会发生小泄漏。

你的内存使用量应该保持平稳,但只是在相当长的一段时间之后。你可以通过在这里使用GC.Collect()(每10个左右)来加快速度。

对于严重的诊断,您需要一个内存分析器。

例如:http://en.wikipedia.org/wiki/CLR_Profiler

答案 1 :(得分:1)

我认为代码中不会有内存泄漏。内存增加只是因为GC.Collect()方法没有实时调用。 试试这个:

        void StaticTick(object o, EventArgs sender)
        {
            GC.Collect();
            memoryuseage.Text = GC.GetTotalMemory(true).ToString();
        }