C # я должен закрыть потоки, когда я использую "использование"? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть служба, работающая на сервере, которая архивирует файлы, и я замечаю, что с каждым днем ​​потребление памяти увеличивается, когда я развертывал ее на сервере, она потребляла 3,6 МБ, сегодня, 3 месяца спустя, она потребляла 180 МБ.

Это часть кода, который я использую:

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));
    }
}

Создание почтового индекса или обновления схожи, поэтому нет смысла вставлять оба кода.

Я делаю рекурсивный вызов этого для папок внутри, и служба запускается один раз в час.

Итак, мой вопрос: все ли эти потоки увеличивают использование моей памяти месяц за месяцем или могутбыть чем-то другим.

1 Ответ

0 голосов
/ 08 июня 2018

Оператор using заботится о закрытии открываемого объекта IDisposable.Это не источник потенциальной утечки памяти, которую вы наблюдаете.

...