Утечка памяти из-за потока памяти

#c#

#c#

Вопрос:

Я знаю, что этот код далек от совершенства, но в моем случае это был единственный способ сделать это правильно, потому что я встраиваю WPF в C #, и при регулярном применении текста проверка орфографии работает некорректно

Итак, это мой код:

 RichTextBox temphotfix = new RichTextBox();
temphotfix.Font = new Font(temphotfix.Font.Name, 14);
System.Windows.Documents.TextRange range = new System.Windows.Documents.TextRange(omschrijving.Document.ContentStart, omschrijving.Document.ContentEnd);
temphotfix.Text = oms;
string temp = temphotfix.Rtf;
byte[] byteArray = Encoding.ASCII.GetBytes(temp);
MemoryStream stream = new MemoryStream(byteArray);
range.Load(stream, DataFormats.Rtf);
range = null;
temp = null;
byteArray = null;
temphotfix.Dispose();
stream.Dispose();
  

Я провел стресс-тестирование этого, и кажется, что при запуске скрипта примерно 5 раз он добавляет около 1 МБ оперативной памяти.

Что я делаю не так, я буквально сделал все, что использовал, нулевым, или пренебрег ими.

Комментарии:

1. Сборка мусора не произойдет, когда вы устанавливаете что-то на null или вызываете Dispose . Он запускается, когда считает, что этого требует нехватка памяти.

2. Хорошей новостью является то, что имея 4 ГБ свободной оперативной памяти, вы можете позволить себе запустить это около 20 000 раз, прежде чем закончится память. Итак, посмотрите, что происходит, когда вы запускаете его 1 000 000 раз — и если у вас заканчивается память, тогда у вас проблема.

3. вы можете использовать Using блок для оформления MemoryStream или, а также на RichTextBox , что поможет освободить этот объект, как только он выйдет из области видимости, вместо вызова Dispose .

4. Используйте профилировщик памяти для диагностики проблем с памятью .

5. Вы не проводили стресс-тест этого. Это закончилось бы исключением ООМ или (что более вероятно) оком.

Ответ №1:

Как я сказал выше в комментарии, вы можете using , вы можете попробовать этот код. надеюсь, это должно помочь.

     using (RichTextBox temphotfix = new RichTextBox())
    {
        temphotfix.Font = new Font(temphotfix.Font.Name, 14);
        System.Windows.Documents.TextRange range = new System.Windows.Documents.TextRange(omschrijving.Document.ContentStart, omschrijving.Document.ContentEnd);
        temphotfix.Text = oms;
        string temp = temphotfix.Rtf;
        byte[] byteArray = Encoding.ASCII.GetBytes(temp);
        using (MemoryStream stream = new MemoryStream(byteArray))
        {
            range.Load(stream, DataFormats.Rtf);
        }
        range = null;
        temp = null;
        byteArray = null;
        //temphotfix.Dispose();
        //stream.Dispose();
    }
  

Комментарии:

1. Я не исправил это, но я думаю, что это немного помогает.