@Sushkov
">alert("yohoho")

Как оптимизировать метод?

При помощи dotMemory выяснил что после вызова метода MailboxCheck(), начинается грузиться память
189d55fdba7d40de9003fe9ed667d47a.PNG, хотя и вызываю сборщик мусора, он не помогает. Как быть?
void MailboxCheck(ImapClient client, String mailBox, String username)
        {
            client.DefaultMailbox = mailBox;
            IEnumerable<uint> uids = client.Search(SearchCondition.All());
            IEnumerable<MailMessage> messages = client.GetMessages(uids);

            foreach (MailMessage message in messages)
            {
                var attachments = message.Attachments;
                string path = folder + username;
                if (attachments.Count > 0)
                {
                    if (!Directory.Exists(path))
                    {
                        DirectoryInfo di = Directory.CreateDirectory(path);// Try to create the directory.
                    }
                }

                if (checktextBox.Checked && wordFind(message.Subject, message.Body, message.From.ToString(), message.To)) { continue; }

                foreach (Attachment attachment in attachments)
                {
                    string destinationFile = path + "\\" + attachment.Name;
                    try
                    {
                    
                        byte[] allBytes = new byte[attachment.ContentStream.Length];
                        using (var filestream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
                        using (BinaryWriter writer = new BinaryWriter(filestream))
                        {
                            writer.Write(allBytes);
                            writer.Close(); //Хотя в принципе закроется при Dispose
                        }
                    }
                    catch
                    {
                        continue;
                    }

                }
            }
            GC.Collect();
        }
  • Вопрос задан
  • 185 просмотров
Пригласить эксперта
Ответы на вопрос 1
@dmitryKovalskiy
программист средней руки
В корне я конечно алгоритм не улучшу, но на пару мелочей внимание обращу.
1) string path = folder + username; - Вы раз за разом пересчитываете эту переменную. Я не нашел внутри цикла изменений переменных - соответственно вы просто так создаете строку, потом убиваете ссылку и объект продолжает висеть до лучших времен.
2) if (checktextBox.Checked && wordFind(message.Subject, message.Body, message.From.ToString(), message.To)) { continue; }
Вы сначала делаете какие-то телодвижения, а потом, вне зависимости от результатов этих телодвижений, выясняете а есть ли в них смысл. Т. е. это просто лишние телодвижения - if можно поднять в самый верх.
3) writer.Close(); //Хотя в принципе закроется при Dispose - ну и зачем тогда?
4)
try
{}
catch{continue;}

Т.е. вы не имеете ни малейшего представления о том какие ошибки возникают при работе. Большое количество исключений в цикле здорово тормозит производительность, а вы даже не знаете возникают ли они. Возможно что всю конструкцию можно убрать добавив пару проверок для избавления от исключений.

Если честно - я бы переделал весь процесс сохранения файлов. Добавить очередь на сохранение и ряд потоков разбирающих эту очередь. Тогда циклом вы набиваете очередь и закрываете метод, а потом это все сохранится. Хотя не думаю что это лучшее решение, но в принципе имеет право на жизнь.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы