2017-01-06 2 views
0

В настоящее время я ищу файлы памяти в нашем приложении, и когда дело доходит до режимов просмотра, которые выполняют любые запросы linq, я нахожу объект в памяти с этим пространством имен. Я использую dotMemory для проверки и перечисляет объект с завершением + <> c. Я не нашел никакого объяснения, что это за объект, и если это реальная проблема, что это находится в памяти, но я обнаружил, что он связан с запросом linq. Код, который перепрограммирует это и как вы можете увидеть результат запроса Linq, никогда не используется.Проблема с памятью в приложении WPF при использовании linq

public class myViewModel : PropertyChangedBase 
{ 

    public myViewModel() 
    { 
     var memissue = _dummyList.ToList().Any(c => c == false); 
    } 

    public string SomeBoundProperty 
    { 
     get { return _someBoundProperty; } 
     set 
     { 
      if (value == _someBoundProperty) return; 
      _someBoundProperty = value; 
      NotifyOfPropertyChange(); 
     } 
    } 
} 

Снимок из dotmemory: enter image description here

Я надеюсь, что кто-то может объяснить, какого рода объекта а + <> с и, возможно, поэтому он не освобожден из памяти или это просто так, что Linq работает?

+0

ViewModel + <> c - это вложенный класс, автоматически генерируемый компилятором для представления lamba, используемого где-то в классе ViewModel. Чтобы узнать, почему он не выпущен, дважды щелкните по строке, отображаемой на скриншоте, и посмотрите, что удерживает этот экземпляр в памяти. dotMemory расскажет вам все об этом. –

ответ

0

.ToList() перечисляет всю коллекцию и сохраняет копию в памяти. Обычно это не полезно, если вы не собираетесь использовать всю информацию в коллекции. Попробуйте удалить .ToList() и посмотреть, что произойдет. Вы должны ожидать немедленной экономии.

Чтобы пролить некоторый свет на вещь +<>c, я считаю, что это происходит от общего типа. Я вывел из кода, который вы указали, что тип действительно List<Boolean>.

+2

+ c <> происходит от анонимного метода, который фиксирует локальные переменные, которые помещаются в класс, сгенерированный компилятором. Если вы пропустите такие вещи, тогда вы должны посмотреть на привязку данных к запросам LINQ, которые передаются объектами WPF. –

+0

@SaxxonPike Извините, я не вижу, что ToList() был там. Это была одна попытка увидеть, была ли она выпущена, если я сделал первый список. Я прочел такой же результат без .ToList(). – Eebo

+0

@Alois Kraus Я не уверен, понимаю ли я ваш ответ, поскольку в моем вопросе модель представления - это полная модель просмотра (забыл добавить список из 4 логических значений), и я не использую результат ни для чего. Я никак не привязываюсь к запросу linq. Я заметил, что я не получаю больше копий объекта в памяти, и тогда я подозреваю, что Linq будет оптимизировать запрос в следующий раз, когда создам новый экземпляр viewmodel? – Eebo

 Смежные вопросы

  • Нет связанных вопросов^_^