Windows窗体方法的高内存使用率

时间:2017-07-04 05:32:48

标签: c# .net winforms out-of-memory

我有一个使用太多内存的c#windows窗体应用程序。代码的和平,这就是问题所在

private void mainTimer_Tick(object sender, EventArgs e)
        {
            try
            {
                if (DateTime.Now.DayOfWeek == DayOfWeek.Saturday)
                {
                    if (File.Exists(Globals.pathNotifFile + "1"))
                    {
                        File.Delete(Globals.pathNotifFile + "1");
                        File.Move(Globals.pathNotifFile, Globals.pathNotifFile + "1");
                    }
                    File.Move(Globals.pathNotifFile, Globals.pathNotifFile + "1");
                }

                if (DateTime.Now.DayOfWeek == DayOfWeek.Sunday)
                {
                    return;
                }

                if (Globals.shotsFired != true)
                {
                    CreateDLclient();
                    Globals.shotsFired = true;
                }

                if (Globals.pathNotifFile == null)
                {
                    return;
                }

                var data = Deserialize();

                foreach (var notifyData in data.@new)
                {
                    if (notifyData.Status == "1" || notifyData.Status == string.Empty)
                    {
                        if (DateTime.Now >= Convert.ToDateTime(notifyData.DateTime))
                        {
                            if (notifyData.Message != string.Empty)
                            {
                                notifyData.Status = SendMessageToUser(notifyData.Message, notifyData.Company, notifyData.EmojiCode);
                                Serialize(data);
                            }
                            else
                            {
                                notifyData.Status = "3";
                                Serialize(data);
                            }
                        }
                        else if (DateTime.Now >= Convert.ToDateTime(notifyData.DateTime).AddMinutes(5))
                        {
                            if (notifyData.Message != string.Empty)
                            {
                                notifyData.Status = SendMessageToUser(notifyData.Message, notifyData.Company, notifyData.EmojiCode);
                                Serialize(data);

                            }
                            else
                            {
                                notifyData.Status = "3";
                                Serialize(data);
                            }
                        }
                    }
                }
            }

它导致一个巨大的问题,应用程序因“内存不足”而崩溃有人可以给我一个建议,我该如何减少内存使用量。我试图调用GC /我知道这不是一个好主意/,但它没有帮助。

提前谢谢

1 个答案:

答案 0 :(得分:2)

您还没有提供有关您在程序中使用的序列化程序的任何信息,但我更倾向于认为它是XMLSerializer,因为它容易出现内存泄漏,并且您在评论中说该程序崩溃了工作超过10-12小时。

XmlSerializer使用程序集生成,无法收集程序集。据我所知,它为重用提供了一些缓存,但仅限于简单的情况。

所以,如果您有类似以下的代码,这通常被称为

XmlSerializer xml = new XmlSerializer(typeof(MyObject), ....

然后迟早会出现内存异常。

编辑:如何避免XMLSerializer的内存泄漏: 请看一下主题 以下链接中的动态生成的程序集MSDN Link 如果我只是总结一下那里写的是什么,你有几种方法。

1)您可以使用以下构造函数来避免动态组装

XmlSerializer.XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)

2)使用字典或散列表,创建自己的缓存

private Dictionary<Tuple<Type, XmlRootAttribute>, XmlSerializer> cacheSerializer = new Dictionary<Tuple<Type, XmlRootAttribute>, XmlSerializer>();
public XmlSerializer GetXmlSerializer(Type type, XmlRootAttribute root) {
    var key = Tuple.Create(type, root);
    XmlSerializer xmlSerializer;
    if (cacheSerializer.TryGetValue(key, out xmlSerializer)) {
        return xmlSerializer;
    }
    xmlSerializer = new XmlSerializer(type, root);
    cacheSerializer.Add(key,xmlSerializer);
    return xmlSerializer;
}