C# windows窗体方法的高内存使用率
我有一个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
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时出现内存不足异常(我想我不支持循环依赖项),或者您的文件太大。我发布了我的方法我发布了我的方法