Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# windows窗体方法的高内存使用率_C#_.net_Winforms_Out Of Memory - Fatal编程技术网

C# windows窗体方法的高内存使用率

C# windows窗体方法的高内存使用率,c#,.net,winforms,out-of-memory,C#,.net,Winforms,Out Of Memory,我有一个c#windows窗体应用程序,它占用了太多内存。代码的和平,这就是问题所在 private void mainTimer_Tick(object sender, EventArgs e) { try { if (DateTime.Now.DayOfWeek == DayOfWeek.Saturday) { if (Fil

我有一个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/我知道这不是一个好主意,但没有帮助


提前感谢您

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

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

因此,如果您有下面这样的代码,它经常被调用→

XmlSerializer xml = new XmlSerializer(typeof(MyObject), ....
然后,您迟早会出现内存不足异常

编辑:如何避免XMLSerializer的内存泄漏: 请看一下这个话题 在以下链接中动态生成的程序集→ 如果我只是总结一下上面写的,你有两种方法

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;
}
private Dictionary cacheSerializer=new Dictionary();
公共XmlSerializer GetXmlSerializer(类型类型,XmlRootAttribute根){
var key=Tuple.Create(类型,根);
XmlSerializer;
if(cacheSerializer.TryGetValue(key,out-xmlSerializer)){
返回xmlSerializer;
}
xmlSerializer=新的xmlSerializer(类型,根);
Add(key,xmlSerializer);
返回xmlSerializer;
}

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

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

因此,如果您有下面这样的代码,它经常被调用→

XmlSerializer xml = new XmlSerializer(typeof(MyObject), ....
然后,您迟早会出现内存不足异常

编辑:如何避免XMLSerializer的内存泄漏: 请看一下这个话题 在以下链接中动态生成的程序集→ 如果我只是总结一下上面写的,你有两种方法

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;
}
private Dictionary cacheSerializer=new Dictionary();
公共XmlSerializer GetXmlSerializer(类型类型,XmlRootAttribute根){
var key=Tuple.Create(类型,根);
XmlSerializer;
if(cacheSerializer.TryGetValue(key,out-xmlSerializer)){
返回xmlSerializer;
}
xmlSerializer=新的xmlSerializer(类型,根);
Add(key,xmlSerializer);
返回xmlSerializer;
}

尝试调试,然后您将得到崩溃的行。我认为这可能是由于反序列化。你反序列化的是什么?你为什么不使用BinaryForamter呢?我调试了很多次。当应用程序工作超过10-12小时时,它会崩溃。如果您有循环依赖项,则在使用XMLSerializer时可能会出现内存不足异常(我想我不支持循环依赖项),或者您的文件太大,无法调试,那么您将得到崩溃的行。我认为这可能是由于反序列化。你反序列化的是什么?你为什么不使用BinaryForamter呢?我调试了很多次。当应用程序工作超过10-12小时时,它会崩溃。如果您有循环依赖项,您可能会在使用XMLSerializer时出现内存不足异常(我想我不支持循环依赖项),或者您的文件太大。我发布了我的方法我发布了我的方法