C# C“我应该在使用”时关闭流吗;使用“?”;?
我有一个服务运行在一个压缩文件的服务器上,我注意到每天消耗的内存都在增加,当我在服务器上部署它时,它消耗了3.6Mb,今天,3个月后,它消耗了180Mb 这是我正在使用的代码的一部分:C# C“我应该在使用”时关闭流吗;使用“?”;?,c#,service,stream,using,C#,Service,Stream,Using,我有一个服务运行在一个压缩文件的服务器上,我注意到每天消耗的内存都在增加,当我在服务器上部署它时,它消耗了3.6Mb,今天,3个月后,它消耗了180Mb 这是我正在使用的代码的一部分: for (i = 0; i < files.Count; i++) { try { if (File.Exists(@dir + zipToUpdate) && new FileInfo(@dir + zipToUpdate).Length < 1048
for (i = 0; i < files.Count; i++)
{
try
{
if (File.Exists(@dir + zipToUpdate) && new FileInfo(@dir + zipToUpdate).Length < 104857600)
{
using (FileStream zipToOpen = new FileStream(@dir + zipToUpdate, FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update, false))
{
if (File.GetCreationTime(@dir + files.ElementAt(i)).AddHours(FileAge) < DateTime.Now)
{
ZipArchiveEntry fileEntry = archive.CreateEntry(files.ElementAt(i));
using (BinaryWriter writer = new BinaryWriter(fileEntry.Open()))
{
using (FileStream sr = new FileStream(@dir + files.ElementAt(i), FileMode.Open, FileAccess.Read))
{
byte[] block = new byte[32768];
int bytesRead = 0;
while ((bytesRead = sr.Read(block, 0, block.Length)) > 0)
{
writer.Write(block, 0, bytesRead);
block = new byte[32768];
}
}
}
File.Delete(@dir + files.ElementAt(i));
}
}
}
}
else
{
createZip(files.GetRange(i, files.Count-i), dir + "\\", getZipName(dir, zipToUpdate));
return;
}
}
catch (Exception ex)
{
rootlog.Error(string.Format("Erro Run - updateZip: {0}", ex.Message));
}
}
for(i=0;i0)
{
writer.Write(块,0,字节读);
块=新字节[32768];
}
}
}
File.Delete(@dir+files.ElementAt(i));
}
}
}
}
其他的
{
createZip(files.GetRange(i,files.Count-i),dir+“\\”,getZipName(dir,ziptupdate));
返回;
}
}
捕获(例外情况除外)
{
Error(string.Format(“Erro Run-updateZip:{0}”,ex.Message));
}
}
zip或更新的创建是相似的,因此粘贴这两个代码没有意义
我对其中的文件夹进行递归调用,服务每小时运行一次
因此,我的问题是,是否所有这些流都是导致我的内存使用量逐月增加的原因,或者它可能是其他原因。使用
语句负责关闭它打开的IDisposable
对象。这不是您所观察到的潜在内存泄漏的来源。如果您使用的是using it自动关闭,循环一旦退出是的,我就是这么想的。。这就是为什么我不知道为什么记忆在增加。。。这段代码中可能有任何内存泄漏?顺便说一句,如果你的using(var foo=woo)
语句只包含另一个using
,你可以省略括号以获得更整洁的代码。@JoãoSilva你如何衡量“内存增加”@JoãoSilva而不是试图猜测内存泄漏(可能)发生在哪里,通过内存分析器运行程序。我的猜测是GC只是在偷懒,但如果没有适当的测量,我猜你猜。