繁体   English   中英

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

[英]Why does my simple wpf C# app with a DispatcherTimer appear to leak memory?

我创建了一个带有单个文本框的简单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();
        }
    }
}

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM