WPF: это причина утечки памяти? - PullRequest
0 голосов
/ 11 августа 2011

[редактировать]

в статическом классе myWork,

public static class myWork()
{
    public static SomeWPFCollectionType myGenerate()
    {
        SomeWPFCollectionType myGenerated=new SomeWPFType();
        List<SomeType> myLists=new List<SomeWPFType>();

        for(int i=0 ; i < someCount ; i++)
        {
            myLists.Add(new SomeType(...););
        }

        myGenerated = SomeTypeToSomeWPFCollection(myGenerated);
        return myGenerated;
    }
}

....

public partial class MainWindow : Window
{

    ...

    private void btn1_Click(...)
    {
        this.someControl.someCollection = myWork.myGenerate();
    }

}
  1. во сколько очищается память myLists?
  2. во сколько очищается память myGenerated?

когда в первый раз, я ожидал, когда я вызову btn1_click. но отчет диспетчера задач Windows, по-видимому, утечка памяти.

-edited-

Не думаю, что в моем коде не было утечки в списках myLists. потому что,

        ....

        myGenerated.Unloaded += delegate(...)
        {
             //i breaked here and see a value of myList in the Watch window of VS.
             Debug.write(myList.ToString());      
        }

        myGenerated = SomeTypeToSomeWPFCollection(myGenerated);
        return myGenerated;

        ....

когда myGenerated был выгружен, но в myList есть еще 15 элементов.

Ответы [ 5 ]

0 голосов
/ 11 августа 2011

Если это статический список, генерируйте его только один раз. Если это динамика, то это НЕ правильное решение. Если ваша цель состоит в том, чтобы привязать элемент управления к динамическому контенту, предоставьте коллекцию в качестве свойства ObservableCollection и привяжите к нему. На вашей «утечке памяти» до тех пор, пока SomeWPFCollectionType, сгенерированный myGenerate (), не выйдет из области видимости, он не будет собирать мусор. Если вы связываете элемент управления со свежей коллекцией, создается впечатление, что старая коллекция должна быть подвергнута сборке мусора. Я думаю, что ваш код некорректен, но я не вижу «утечки памяти».

        private List<DocFieldEnum1row> docFieldEnum1rows;

        public List<DocFieldEnum1row> DocFieldEnum1rows 
        { 
            get 
            {
                if (docFieldEnum1rows == null)
                {
                    docFieldEnum1rows = new List<DocFieldEnum1row>();
                    // code to populate list here                
                }
                return docFieldEnum1rows;
            } 
        }
0 голосов
/ 11 августа 2011

Я не вижу утечек памяти в коде, который вы разместили. Диспетчер задач просто не подходит для проверки утечек памяти. Сборщик мусора не обязан немедленно освобождать все объекты, на которые нет ссылок.

Если вы действительно подозреваете утечку памяти, посмотрите на sos.dll для отладки. Смотри: http://www.codeproject.com/KB/dotnet/Memory_Leak_Detection.aspx

Во втором фрагменте кода делегат захватывает ссылку на вновь созданный и заполненный список и, конечно, выдает этот список в окно отладки.

Вкратце: код может быть в порядке, но вы должны работать над своими навыками отладки.

0 голосов
/ 11 августа 2011

} 1. во сколько очищается память myLists?

При нажатии на кнопку. Это НЕ очищает предыдущий экземпляр myGenerated, очевидно.

2. во сколько очищается память myGenerated?

Ваш код создает новый экземпляр myGenerated при каждом нажатии кнопки.

0 голосов
/ 11 августа 2011

Сборщик мусора освободит память как для myLists, так и для myGenerated, когда пожелает * когда эти переменные выйдут из области видимости.

Область действия для myLists находится только в вашем статическом классе, а область действия для myGenerated.намного больше.

Кроме того, новый экземпляр myGenerated заменяет старый экземпляр при нажатии кнопки.Это делает старый экземпляр бесплатным для сборки мусора.

Итак, в предоставленном вами коде нет реальной утечки памяти.

Я не уверен, что это ответ на ваш вопрос, ноНадеюсь, это поможет.

0 голосов
/ 11 августа 2011

Сборщик мусора отвечает за освобождение неиспользованной ранее выделенной памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...